Pergunta

Como é que as pessoas se aproximam zombando fora TcpClient (ou coisas como TcpClient)?

Eu tenho um serviço que leva em um TcpClient. Devo dispor que em outra coisa mais mockable? Como devo abordar isso?

Foi útil?

Solução

Quando chegar a aulas de simulação que não são testar amigável (ou seja selada / não implementar qualquer interface / métodos não são virtual), você provavelmente iria querer usar o Adaptador padrão de projeto.

Neste padrão que você adicionar uma classe de embrulho que implementa uma interface. Você deve então zombar da interface, e certifique-se todos os seus usos de código que interface em vez da classe concreta hostil. Seria algo parecido com isto:

public interface ITcpClient
{
   Stream GetStream(); 
   // Anything you need here       
}
public class TcpClientAdapter: ITcpClient
{
   private TcpClient wrappedClient;
   public TcpClientAdapter(TcpClient client)
   {
    wrappedClient = client;
   }

   public Stream GetStream()
   {
     return wrappedClient.GetStream();
   }
}

Outras dicas

Eu acho @Hitchhiker está no caminho certo, mas eu também gosto de pensar sobre abstrair as coisas como essa só um passo adiante.

Eu não zombar o TcpClient diretamente, porque isso ainda iria amarrá-lo muito de perto com a implementação subjacente, mesmo que você tenha escrito testes. Ou seja, a sua aplicação está ligada a um método TcpClient especificamente. Pessoalmente, gostaria de tentar algo como isto:

   [Test]
    public void TestInput(){

       NetworkInputSource mockInput = mocks.CreateMock<NetworkInputSource>();
       Consumer c = new Consumer(mockInput);

       c.ReadAll();
    //   c.Read();
    //   c.ReadLine();

    }

    public class TcpClientAdapter : NetworkInputSource
    {
       private TcpClient _client;
       public string ReadAll()
       { 
           return new StreamReader(_tcpClient.GetStream()).ReadToEnd();
       }

       public string Read() { ... }
       public string ReadLine() { ... }
    }

    public interface NetworkInputSource
    {
       public string ReadAll(); 
       public string Read();
       public string ReadLine();
    }

Esta implementação irá separar você de Tcp detalhes relacionados por completo (se isso é um objetivo do projeto), e você pode até mesmo cachimbo na entrada de teste de um conjunto codificado duro de valores, ou um arquivo de entrada de teste. Muito lado, se você está na estrada para testar seu código para o longo curso.

Usando o padrão Adapter é definitivamente a abordagem TDD padrão para o problema. Você poderia, no entanto, também acaba de criar a outra extremidade da conexão TCP e com a unidade equipamento de teste isso.

IMO o uso generalizado de classe do adaptador ofusca a maioria de partes importantes de um projeto, e também tende a remover um monte de coisas de que está sendo testado que realmente deveria ser testada em contexto. Então a alternativa é construir a sua andaimes testes para incluir mais do sistema em teste. Se você está construindo seus testes a partir do zero, você ainda vai alcançar a capacidade de isolar a causa de uma falha em uma determinada classe ou função, ele só não vai estar em isolamento ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top