Pergunta

Tenho alguns testes unitários que estou escrevendo para uma aplicação WPF e, por mais que tenha tentado evitá-los, tenho alguns códigos em teste que instanciam uma View.Assim que a visualização é instanciada, todas as extensões de marcação, estilos, etc. são avaliadas.Para resolver isso eu criei um manequim Aplicativo e registrou todos os recursos necessários quando o assembly de teste foi inicializado:

[TestClass]
public class AssemblyInitialize
{
    [AssemblyInitialize]
    public static void SetupTestAssembly(TestContext context)
    {
        if (Application.Current == null)
            new Application();

        var resources = new List<string>
            {
              "pack://application:,,,/AssemblyName;component/ResourceDictionary.xaml"
            };

       foreach(var resource in resources)
       {
           var uri = new Uri(resource);
           var dictionary = new ResourceDictionary { Source = uri };
           Application.Current.Resources.MergedDictionaries.Add(dictionary);
       }
    }
}

Eu usei essa abordagem no passado e funciona bem.

Encontrei um pequeno problema com essa abordagem.Eu tenho alguns recursos que usam pacote://siteoforigin: no pacote Uri, e quando os testes instanciam essa visualização recebo um erro sobre não conseguir resolver o arquivo.

O XAML:

<ResourceDictionary
   xmlns="...">

   <ImageBrush 
      x:Key="ResourceName"
      ImageSource="pack://siteoforigin:,,,/Resources/image.png" 
      />
</ResourceDictionary>

Mensagem de erro:

 Could not find a part of the path 'C:\\Solution\\TestResults\\Workspace_2012-03-01 14_54_29\\Resources\\image.png'

Adicionei o diretório Resources como um item de implantação e confirmei que a imagem é o diretório de saída TestRun.Parece que o AppDomain está operando uma pasta acima da localização dos meus assemblies de teste, porque o arquivo está localizado em:

c:\Solução estResults\Workspace_2012-03-01 14_54_29\ Fora ecursos\imagem.png

Alguma sugestão sobre como posso fazer com que o aplicativo WPF use o diretório Out como pasta principal?

Foi útil?

Solução

Isso ocorre porque o AppDomain.BaseDirectory que é configurado pelo seu executor de teste não tem um final '/' caractere, isso faz com que o código que resolve siteoforigin paths para perder o último diretório no caminho.

Você pode verificar isso observando o resultado do código a seguir durante a execução normal ou em testes.

Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory);

Isto foi recentemente fixo no NUnit (incluído no 2.6), mas ainda pode ser um problema com outros executores de teste.

Se você estiver interessado, isso é equivalente ao que o siteoforigin código está fazendo:

new Uri(new Uri(baseDirectory), "some/relative/path.jpg").LocalPath

Tente isso com e sem uma barra final baseDirectory.

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