Модульное тестирование приложения WPF с пакетом siteoforigin Uri - PullRequest
5 голосов
/ 02 марта 2012

У меня есть несколько модульных тестов, которые я пишу для приложения WPF, и, как бы я ни пытался этого избежать, у меня есть тестируемый код, который создает экземпляр View. Как только создается представление, оцениваются все расширения разметки, стили и т. Д. Для решения этой проблемы я создал фиктивное приложение и зарегистрировал все необходимые ресурсы при инициализации тестовой сборки:

[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);
       }
    }
}

Я использовал этот подход в прошлом, и он работает нормально.

Я столкнулся с небольшим препятствием при таком подходе. У меня есть несколько ресурсов, которые используют pack: // siteoforigin: в пакете Uri, и когда тесты создают это представление, я получаю ошибку о невозможности разрешить файл.

XAML:

<ResourceDictionary
   xmlns="...">

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

Сообщение об ошибке:

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

Я добавил каталог Resources в качестве элемента развертывания и подтвердил, что образ является выходным каталогом TestRun. Похоже, что AppDomain работает на одну папку выше, где находится место моих тестовых сборок, потому что файл на самом деле находится по адресу:

c: \ Solution \ TestResults \ Workspace_2012-03-01 14_54_29 \ Out \ Resources \ image.png

Какие-либо предложения о том, как заставить приложение WPF использовать каталог Out в качестве основной папки?

1 Ответ

3 голосов
/ 28 марта 2012

Это связано с тем, что AppDomain.BaseDirectory, установленный вашим тестовым организатором, не имеет завершающего символа '/', поэтому код, разрешающий пути siteoforigin, теряет последний каталог в пути.

Вы можете проверить это, посмотрев на результат следующего кода при нормальной работе или в тестах.

Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory);

Это было недавно исправлено в NUnit (включено в 2.6), но все еще может быть проблемой с другими участниками теста.

Если вам интересно, это эквивалентно тому, что делает код siteoforigin:

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

Попробуйте это с и без косой черты в baseDirectory.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...