Necesito escribir una prueba unitaria para un método que toma una secuencia que proviene de un archivo de texto. Me gustaría hacer algo como esto:
Stream s = GenerateStreamFromString("a,b \n c,d");
c#
unit-testing
string
stream
Omu
fuente
fuente
StringReaderStream
en stackoverflow.com/a/55170901/254109Respuestas:
No olvides usar Usando:
Sobre la
StreamWriter
no disposición.StreamWriter
es solo un contenedor alrededor del flujo base y no utiliza ningún recurso que deba eliminarse. ElDispose
método cerrará el subyacente alStream
que seStreamWriter
está escribiendo. En este caso ese es elMemoryStream
que queremos volver.En .NET 4.5 ahora hay una sobrecarga
StreamWriter
que mantiene abierta la secuencia subyacente una vez que se elimina el escritor, pero este código hace lo mismo y también funciona con otras versiones de .NET.Consulte ¿Hay alguna forma de cerrar un StreamWriter sin cerrar su BaseStream?
fuente
GenerateStreamFromString
método no estás usando el Uso con el StreamWriter. ¿Hay alguna razón para esto?StreamWriter
probablemente esté haciendo lo que dijiste internamente de todos modos. La ventaja es la encapsulación y el código más simple, pero a costa de abstraer cosas como la codificación. Depende de lo que intentes lograr.Otra solución:
fuente
new MemoryStream(Encoding.UTF8.GetBytes("\ufeff" + (value ?? ""))
si necesita que se incluya la lista de materiales al comienzo de la transmisiónnew MemoryStream( value, false )
. No puede hacer una secuencia de solo lectura si tiene que escribirla con un escritor de secuencias.Agregue esto a una clase de utilidad de cadena estática:
Esto agrega una función de extensión para que pueda simplemente:
fuente
StreamWriter
. La solución fue usar un constructor diferente, uno que me permitiera especificar leaveOpen .fuente
Use la
MemoryStream
clase, llamandoEncoding.GetBytes
para convertir su cadena en una matriz de bytes primero.¿Posteriormente necesita un
TextReader
en la corriente? Si es así, puede suministrar unStringReader
directamente y omitir los pasosMemoryStream
yEncoding
.fuente
Usé una mezcla de respuestas como esta:
Y luego lo uso así:
fuente
Utilizamos los métodos de extensión que se enumeran a continuación. Creo que debería hacer que el desarrollador tome una decisión sobre la codificación, por lo que hay menos magia involucrada.
fuente
return ToStream(s, Encoding.UTF8);
. En la implementación actual (return s.ToStream(Encoding.UTF8);
, el desarrollador se ve obligado a pensar más para comprender el código y parece que el casos == null
no se maneja y se tiraNullReferenceException
.)Aqui tienes:
fuente
Versión modernizada y ligeramente modificada de los métodos de extensión para
ToStream
:Modificación como se sugiere en el comentario de @ Palec de la respuesta de @Shaun Bowe.
fuente
Creo que puede beneficiarse al usar un MemoryStream . Puede llenarlo con los bytes de cadena que obtiene utilizando el método GetBytes de la clase Encoding .
fuente
Si necesita cambiar la codificación, voto por la solución de @ShaunBowe . Pero cada respuesta aquí copia toda la cadena en la memoria al menos una vez. Las respuestas con
ToCharArray
+BlockCopy
combo lo hacen dos veces.Si eso importa aquí, hay un
Stream
contenedor simple para la cadena UTF-16 sin procesar. Si se usa con unaStreamReader
selecciónEncoding.Unicode
para ello:Y aquí hay una solución más completa con las comprobaciones obligatorias necesarias (derivadas de
MemoryStream
lo que tieneToArray
y también losWriteTo
métodos).fuente
Una buena combinación de extensiones de cadena:
fuente