Unidade de teste de recursos locais e globais em asp.net mvc
-
06-07-2019 - |
Pergunta
Eu tenho uma classe que envolve o GetGlobalResourceObject e GetLocalResourceObjet para que eles possam ser facilmente utilizado em MVC. As classes de validação do modelo, em seguida, carregar as mensagens de erro dinamicamente a partir de arquivos de recursos. O problema é o teste de unidade. Os usos de código "~ /", e enquanto tudo funciona corretamente quando a solução é correr, eu não posso ver como fazer os testes de unidade, porque eu sempre receber o seguinte erro "System.Web.HttpException: A aplicação caminho virtual relativo '~ / 'não pode ser feita absoluta, porque o caminho para a aplicação não é conhecido. "
O código que gera a exceção é o seguinte, usado para avaliar uma expressão e retorna um objeto de recurso global.
Private Function GetExpressionFields(ByVal expression As String) As ResourceExpressionFields
Return GetExpressionFields(expression, "~/")
End Function
Private Function GetExpressionFields(ByVal expression As String, ByVal path As String) As ResourceExpressionFields
Dim context As New ExpressionBuilderContext(path)
Dim resource_builder As New ResourceExpressionBuilder()
Dim fields As ResourceExpressionFields
fields = DirectCast(resource_builder.ParseExpression(expression, GetType(String), context), ResourceExpressionFields)
Return fields
End Function
Algumas ideias sobre como testar este e outros códigos que os arquivos de recursos usos?
Solução
Eu levei uma abordagem um pouco diferente. Eu uso arquivos de recursos fora do App_ * diretórios, caso em que o IDE irá adicionar uma ferramenta personalizada para o arquivo para gerar um wrapper fortemente tipado para os recursos que funciona em qualquer lugar da solução, incluindo em pontos de vista, e se comporta durante testes de unidade: http://odetocode.com/Blogs/scott/archive/ 2009/07/15 / 13211.aspx
Isso não é uma resposta exata para sua pergunta, mas eu acredito recebendo os App_ * recursos para se comportar corretamente em todas as condições foi um pouco de trabalho.
Outras dicas
Você pode criar uma propriedade em sua classe ResourceExtensions, por exemplo bool IsInTestScope, e depois em sua classe de teste defini-lo em verdade, e método dentro que retorna texto localizado fazer algo como isto:
public static string Resource (este controlador Controller, expressão de cadeia, params object [] args)
{
if (! IsInTestScope)
{
= ResourceExpressionFields campos GetResourceFields (Expression, "~ /");
retornar GetGlobalResource (campos, args);
}
retorno string.Empty;
}
Eu encontrei abordagem para testar o código que usa recursos dentro de App_ * diretórios. Eu descrevi a minha solução no meu blog link de texto