Eu preciso escrever um teste de unidade para um método que leva um fluxo que vem de um arquivo de texto. Eu gostaria de fazer algo assim:
Stream s = GenerateStreamFromString("a,b \n c,d");
c#
unit-testing
string
stream
Omu
fonte
fonte
StringReaderStream
em stackoverflow.com/a/55170901/254109Respostas:
Não se esqueça de usar o Using:
Sobre o
StreamWriter
não ser descartado.StreamWriter
é apenas um invólucro em torno do fluxo base e não usa nenhum recurso que precise ser descartado. ODispose
método fechará o subjacenteStream
queStreamWriter
está sendo gravado. Nesse caso, é oMemoryStream
que queremos retornar.Agora, no .NET 4.5, existe uma sobrecarga
StreamWriter
que mantém o fluxo subjacente aberto depois que o gravador é descartado, mas esse código faz a mesma coisa e funciona com outras versões do .NET também.Consulte Existe alguma maneira de fechar um StreamWriter sem fechar seu BaseStream?
fonte
GenerateStreamFromString
método você não está usando o Using with the StreamWriter. Existe uma razão para isso?StreamWriter
provavelmente está fazendo o que você disse internamente de qualquer maneira. A vantagem é o encapsulamento e o código mais simples, mas com o custo de abstrair coisas como a codificação. Depende do que você está tentando alcançar.Outra solução:
fonte
new MemoryStream(Encoding.UTF8.GetBytes("\ufeff" + (value ?? ""))
se você precisar incluir a lista técnica no início do fluxonew MemoryStream( value, false )
. Você não pode criar um fluxo somente leitura se precisar gravá-lo com um gravador de fluxo.Adicione isso a uma classe de utilitário de cadeia estática:
Isso adiciona uma função de extensão para que você possa simplesmente:
fonte
StreamWriter
. A correção foi usar um construtor diferente - um que me permitisse especificar leaveOpen .fonte
Use a
MemoryStream
classe chamandoEncoding.GetBytes
para transformar sua string em uma matriz de bytes primeiro.Você precisa posteriormente de um
TextReader
stream? Nesse caso, você pode fornecer umStringReader
diretamente e ignorar as etapasMemoryStream
eEncoding
.fonte
Eu usei uma mistura de respostas como esta:
E então eu uso assim:
fonte
Usamos os métodos de extensão listados abaixo. Eu acho que você deve fazer o desenvolvedor tomar uma decisão sobre a codificação, para que haja menos mágica envolvida.
fonte
return ToStream(s, Encoding.UTF8);
. Na implementação atual (return s.ToStream(Encoding.UTF8);
, o desenvolvedor é obrigado a pensar mais difícil de entender o código e parece que o caso des == null
se não tratada e jogaNullReferenceException
.Aqui está:
fonte
Versão modernizada e ligeiramente modificada dos métodos de extensão para
ToStream
:Modificação sugerida no comentário de @ Palec da resposta de @ Shaun Bowe.
fonte
Eu acho que você pode se beneficiar do uso de um MemoryStream . Você pode preenchê-lo com os bytes de seqüência de caracteres que você obtém usando o método GetBytes da classe Encoding .
fonte
Se você precisar alterar a codificação, voto na solução de @ShaunBowe . Mas todas as respostas aqui copiam toda a cadeia de caracteres da memória pelo menos uma vez. As respostas com
ToCharArray
+BlockCopy
combo fazem isso duas vezes.Se isso importa aqui, é um
Stream
wrapper simples para a sequência UTF-16 bruta. Se usado com umaStreamReader
seleçãoEncoding.Unicode
para ele:E aqui está uma solução mais completa, com as verificações vinculadas necessárias (derivadas de
MemoryStream
outras formasToArray
eWriteTo
métodos).fonte
Uma boa combinação de extensões String:
fonte