Pergunta

Em primeiro lugar, estou ciente de que esta questão perigosamente está perto de: Como MapPath em um teste de unidade em C #

Eu estou esperando no entanto, que tem uma solução diferente. Meu problema seguinte:

No meu código eu tenho um objeto que precisa ser validado. Estou criando testes de unidade para cada método de validação para se certificar de que está validando corretamente. Estou criando dados de simulação e carregá-lo para o objeto, então validá-lo. O problema é que, dentro da validação, quando ocorre um erro, um código de erro é atribuído. Esse código de erro é usado para reunir informações sobre o erro de um arquivo xml usando Server.MapPath. No entanto, ao tentar obter o arquivo xml, uma exceção é lançada ou seja, o arquivo não pode ser encontrado.

Desde MapPath é no meu código de validação, e não o meu teste de unidade, como faço para que meu teste de unidade para reconhecer o caminho? Será que esta pergunta faz sentido?

Error Line (No meu código de validação não meu teste de unidade):

XDocument xdoc = XDocument.Load(HttpContext.Current.Server.MapPath("App_Data/ErrorCodes.xml"));

simplificado:. O teste de unidade chama um método no meu programa que chama Server.MapPath que então falhar

Foi útil?

Solução

Eu resumo o "provedor de nome de arquivo" em uma classe que simplesmente retorna um local, então você pode zombar-lo muito, muito mais fácil.

public class PathProvider
{
    public virtual string GetPath()
    {
        return HttpContext.Current.Server.MapPath("App_Data/ErrorCodes.xml");
    }
}

Em seguida, você pode usar a classe PathProvider diretamente ...

PathProvider pathProvider = new PathProvider();
XDocument xdoc = XDocument.Load(pathProvider.GetPath());

Ou zombar-lo em seus testes:

PathProvider pathProvider = new MockPathProvider(); // using a mocking framework
XDocument xdoc = XDocument.Load(pathProvider.GetPath());

Outras dicas

Depois de algum googling rigorosa e alguma ajuda de um colega que surgiu com uma solução simples já embutido no .net

Acima dos testes de unidade que acessa o processo de validação, acrescentei:

 [TestMethod()]
 [HostType("ASP.NET")]
 [UrlToTest("http://localhost:###/upload_file.aspx")]
 [AspNetDevelopmentServerHost("Path To Web Application", "Path To Web Root")]

Isso funciona perfeitamente. Basicamente, quando o teste é chamado, ele carrega a URL com o teste de unidade especificada no carregamento da página. Uma vez que é um web site que agora está chamando o teste de unidade, a validação terá acesso a Server.MapPath. Esta solução pode não funcionar para todos, mas foi perfeito para isso. Obrigado a todos que você contribuiu.

Tente usar Rhino Mocks ou um quadro zombando alternativa para Mock o httpContext (ou outros objetos dependentes) Ou você pode escrever seus próprios objetos mock. Ou escrever uma classe MapPathWrapper, herdam de uma classe MapPathWrapperBase para o seu ambiente real, em seguida, no para os testes de unidade criar um objeto MockMapPathWrapper.

Deve haver uma abundância de exemplos para zombar no SO.

Aqui está uma perguntei:

Como usar Rhino Mocks para mock um HttpContext .application

Atualizar Eu só tenho experiência em fazer isso com o Asp.Net MVC, com webforms Eu imagein seria muito mais difícil por causa da falta de uma classe HttpContextBase.

Gostaria de extrair métodos que aceitam suas dependências como argumentos:

public void Validate(HttpContext context)
{
    ValidatePath(context.Server.MapPath("App_Data/ErrorCodes.xml"));
}

public void ValidatePath(string path)
{
    XDocument xdoc = XDocument.Load(path);
    ValidateDocument(xdoc);
}

public void ValidateDocument(XDocument xdoc)
{
    // Original code
}

Você pode então testar os vários métodos de forma independente. Por exemplo, testar como alças ValidatePath() um arquivo ausente.

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