Pergunta

Criei alguns serviços de varíola usando o Kit Starter Rest. No começo, foi um pouco complicado criar os testes de unidade para a camada de serviço, mas no final foi bem projetado e eu consegui zombar do contexto e definir expectativas.

Mas estou começando com o lado do cliente agora e estou tendo alguns problemas para descobrir como zombar das coisas. Não é tão direto.

Então, eu tenho esse método de amostra que publica via HTTP alguns dados usando um DataContract e XML como transporte.

public class ServiceClient: IService

{
    private const string uri_template = "http://{0}:{1}/SomeService.svc/";
    private readonly HttpClient http = new HttpClient();

    public ServiceClient(string host, int port)
    {
        http.BaseAddress = new Uri(string.Format(uri_template , host, port));
    }

    public void Create(MyDataContract my_data_contract)
    {
        var content = HttpContentExtensions
                        .CreateDataContract(
                          my_data_contract, 
                          Encoding.Default, 
                          "text/xml", 
                          null);
        var response = http.Post("Create", content);
        if (response.StatusCode != HttpStatusCode.Created) {
            throw new Exception("something is not right");
        }
    }
}

Este método está funcionando e, de fato, postar os dados e serializar corretamente.

O que eu quero fazer é testá -lo de unidade.

Minhas perguntas são:

  1. Como faço para fazer stubs/zombares para HttpContexTEXTENSONIONS, sabendo que ela não implementa nenhuma interface?

  2. E para httpclient? Isso é pior, pois está cheio de métodos de extensão definidos em outros lugares (post e métodos semelhantes são extensões).

Em 2. Acho que posso me manter em 'enviar' e são sobrecargas, mas então é o mesmo problema que em 1

O que eu estava pensando em fazer é extrair interfaces para httpContextextenções e httpclient, fazer uma criança para cada uma e implementar as interfaces delegando para os pais e, em seguida, usando as interfaces no meu código.

Mas isso é muito trabalho IMHO.

Estou usando Rhinomocks como minha estrutura de zombaria, para que eu não possa zombar/Stub Concrete Classes, e gostaria de cumpri -la, porque realmente acho que zombar de classes de concreto não é muito elegante.

Então, existe uma maneira mais limpa/mais rápida/mais inteligente para o código de teste de unidade, como o acima?

PD: Isto é para o WCF Starter Kit Preview 2

Foi útil?

Solução

Se você realmente deseja zombar desse código, uma abordagem que pode funcionar para esse cenário é receber uma instância httpclient na classe ServiceClient. A classe HTTPClient contém um pipeline de processamento que você pode personalizar com manipuladores personalizados. Para seus testes, você pode basicamente injetar um manipulador nessa instância httpclient para retornar uma resposta ridicularizada ao teste antes que o serviço real seja chamado no último manipulador (estágio de transporte). Dê uma olhada neste post para ter uma idéia de como isso pode ser implementado,

http://weblogs.asp.net/cibrax/archive/2009/03/18/negotiating-a-saml-token-for-rest-cients-with-httpclient.aspx

Atenciosamente, Pablo.

Outras dicas

Eu escrevi a maior parte do código httpclient. A sugestão de Pablo é o que eu fiz nos testes de unidade - consulte FILLTRANSPORT.CS no zip de origem.

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