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

StringReaderStreamen stackoverflow.com/a/55170901/254109Respuestas:
No olvides usar Usando:
Sobre la
StreamWriterno disposición.StreamWriteres solo un contenedor alrededor del flujo base y no utiliza ningún recurso que deba eliminarse. ElDisposemétodo cerrará el subyacente alStreamque seStreamWriterestá escribiendo. En este caso ese es elMemoryStreamque queremos volver.En .NET 4.5 ahora hay una sobrecarga
StreamWriterque 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
GenerateStreamFromStringmétodo no estás usando el Uso con el StreamWriter. ¿Hay alguna razón para esto?StreamWriterprobablemente 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
MemoryStreamclase, llamandoEncoding.GetBytespara convertir su cadena en una matriz de bytes primero.¿Posteriormente necesita un
TextReaderen la corriente? Si es así, puede suministrar unStringReaderdirectamente y omitir los pasosMemoryStreamyEncoding.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 == nullno 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+BlockCopycombo lo hacen dos veces.Si eso importa aquí, hay un
Streamcontenedor simple para la cadena UTF-16 sin procesar. Si se usa con unaStreamReaderselecciónEncoding.Unicodepara ello:Y aquí hay una solución más completa con las comprobaciones obligatorias necesarias (derivadas de
MemoryStreamlo que tieneToArrayy también losWriteTométodos).fuente
Una buena combinación de extensiones de cadena:
fuente