wpf - 使用 siteoforigin 包 Uri 单元测试 WPF 应用程序

标签 wpf unit-testing mstest vs-unit-testing-framework

我有一些我正在为 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/

相关文章:

wpf - 在 DataTemplates 中使用 TemplateBinding

c# - 在 Moq 上使用与 UserManager 的接口(interface)

java - 如何对在 AndroidViewModel 类内部进行改造调用的方法进行单元测试?

c# - 使用 ImmutableList 时 DynamicData 无法按预期工作

c# - 如何手动更新多重绑定(bind)

wpf - 绑定(bind)到装饰元素的祖先

c# - 为代码覆盖关闭 Visual Studio 2010 中的 Lambda 表达式

mstest - 如何从 MSTEST 运行单个测试用例

c# - 了解数据绑定(bind)如何在 UserControl 的 DependencyProperty 及其宿主应用程序的属性之间工作

unit-testing - 如何对使用适用于 Go V2 的 AWS 开发工具包实现的 Lambda 进行单元测试