使用siteoforigin pack Uri对WPF应用程序进行单元测试

bry*_*ook 5 wpf unit-testing mstest vs-unit-testing-framework

我有一些单元测试,我正在为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);
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

我过去曾经使用过这种方法,而且运行正常.

我用这种方法遇到了一个小麻烦.我有一些资源使用pack:// siteoforigin:在包Uri中,当测试实例化这个视图时,我收到一个关于无法解析文件的错误.

XAML:

<ResourceDictionary
   xmlns="...">

   <ImageBrush 
      x:Key="ResourceName"
      ImageSource="pack://siteoforigin:,,,/Resources/image.png" 
      />
</ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)

错误信息:

 Could not find a part of the path 'C:\\Solution\\TestResults\\Workspace_2012-03-01 14_54_29\\Resources\\image.png'
Run Code Online (Sandbox Code Playgroud)

我已将Resources目录添加为部署项,并且我已确认该图像是TestRun输出目录.似乎AppDomain在我的测试程序集的位置上方运行一个文件夹,因为该文件实际位于:

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

有关如何让WPF应用程序使用Out目录作为主文件夹的任何建议?

Lea*_*and 5

这是因为AppDomain.BaseDirectory测试运行程序设置的 没有尾随'/'字符,这会导致解析siteoforigin路径的代码丢失路径中的最后一个目录。

您可以通过查看正常运行或测试时以下代码的结果来检查这一点。

Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory);
Run Code Online (Sandbox Code Playgroud)

这个问题最近已在 NUnit 中修复(包含在 2.6 中),但对于其他测试运行程序来说可能仍然是一个问题。

siteoforigin如果您感兴趣,这与代码所做的等效:

new Uri(new Uri(baseDirectory), "some/relative/path.jpg").LocalPath
Run Code Online (Sandbox Code Playgroud)

尝试在 中带或不带尾部斜杠baseDirectory