我正在编写一些用于 WPF 应用程序的单元测试,尽管我试图避免这样做,但我需要测试一些实例化视图的代码。一旦视图被实例化,所有的标记扩展、样式等都会被评估。为了解决这个问题,我创建了一个虚拟的 Application 并在测试程序集初始化时注册任何必需的资源:
[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 Uri中使用了pack://siteoforigin:,当测试实例化这个视图时,会出现无法解析文件的错误。
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'
我已将资源目录添加为部署项,并确认该图像位于TestRun输出目录中。似乎AppDomain的操作目录在我的测试程序集位置的上一级文件夹,因为该文件实际上位于:c:\Solution\TestResults\Workspace_2012-03-01 14_54_29\Out\Resources\image.png
有什么建议可以让WPF应用程序使用Out目录作为其主文件夹吗?
AppDomain.CurrentDomain.SetData("APPBASE", "FolderNameHere");
似乎有更好的方法,但我的记忆正在衰退。这可能已经足够了(商标)。 - ianschol