我有一些我正在为 WPF 应用程序编写的单元测试,尽管我试图避免它,但我有一些正在测试的代码可以实例化一个 View 。一旦 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 中,当测试实例化此 View 时,我收到关于无法解析文件的错误。
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\出 \资源\图像.png
关于如何让 WPF 应用程序使用 Out 目录作为主文件夹的任何建议?
最佳答案
这是因为 AppDomain.BaseDirectory
由您的测试运行程序设置的没有尾随 '/'
字符,这会导致解析 siteoforigin
的代码路径以丢失路径中的最后一个目录。
您可以在正常运行或在测试中通过查看以下代码的结果来检查这一点。
Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory);
这是最近 fixed在 NUnit(包含在 2.6 中)中,但可能仍然是其他测试运行程序的问题。
如果您有兴趣,这相当于
siteoforigin
代码正在做:new Uri(new Uri(baseDirectory), "some/relative/path.jpg").LocalPath
尝试在
baseDirectory
中使用和不使用尾部斜杠.
关于wpf - 使用 siteoforigin 包 Uri 单元测试 WPF 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9523274/