У меня есть несколько модульных тестов, которые я пишу для приложения WPF, и, как бы я ни старался этого избежать, у меня есть тестируемый код, который создает экземпляр представления. Как только создается экземпляр представления, оцениваются все расширения разметки, стили и т. д. Чтобы решить эту проблему, я создал фиктивное Приложение и зарегистрировал все необходимые ресурсы при инициализации тестовой сборки:
[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 в качестве основной папки?
AppDomain.CurrentDomain.SetData("APPBASE", "FolderNameHere");
Вроде есть способ получше, но память меня подводит. Это может быть достаточно хорошо (тм). - person ianschol   schedule 02.03.2012