如何使单元测试了解Application.Resources

时间:2012-02-02 22:49:44

标签: c# wpf visual-studio-2010 unit-testing xaml

我的WPF项目的Application.Resources区域中包含一个ResourceDictionary。这个

来自App.xaml(以此SO response的方式):

App.xaml中:

<Application.Resources>    
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>                
            <ResourceDictionary 
                  Source="MyDictionary.xaml">
                </ResourceDictionary>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

在这本词典中,我有几种样式,包括页面样式:

MyDictionary.xaml:

<SolidColorBrush x:Key="PageBackgroundBrush" 
                     Color="Black" />

<Style x:Key="PageStyle" TargetType="Page">
        <Setter Property="Background" Value="{StaticResource ResourceKey=PageBackgroundBrush}" />
        <Setter Property="Height" Value="Auto" />
        <Setter Property="Width" Value="Auto" />
    </Style>

MyPage.xaml:

<Page x:Class="MyProject.MyPage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="250"
      Title="Page"
      Style="{StaticResource ResourceKey=PageStyle}"
      >
<Grid>
</Grid>
</Page>

MyPage.xaml.cs

public class MyPage : Page
{
    public MyPage() 
    {
        // this part crashes during unit tests because 'PageStyle' was not found
        InitializeComponent();
    }
}

当Visual Studio在设计模式下查看页面和运行项目时,此设置都可以正常工作。

我正在使用Visual Studio's built in Unit Test tools。当我尝试为MyPage类(在构造函数触发时使用MyPage.xaml)进行单元测试时,我的测试失败了。 MyPage.xaml使用Application.Resources中包含的字典中定义的样式。测试无法识别PageStyle,因为单元测试开始时未包含Application.Resources,因此页面无法实例化。如何在我的单元测试中包含我的Application.Resources?或者,是否有更好的方法来运行WPF页面和窗口的单元测试?

3 个答案:

答案 0 :(得分:6)

根据您的评论,我建议您使用Model-View-ViewModel (MVVM)或任何其他方案从GUI级别组件中提取尽可能多的逻辑,并在那里测试该逻辑。它并没有直接解决你当前的问题,但事实是GUI逻辑很难测试 - 在我看来,使用MS Test和其他单元测试运行器这么困难,不值得。

单元测试GUI是一个痛苦的世界(我已经尝试过)。通常有更好的工具。

答案 1 :(得分:2)

虽然方法https://stackoverflow.com/a/748440/57883可能更好地隔离测试错误并构建测试库,但我已经找到了一些可行的代码并实际加载了我遗漏的实际项目。

var targetAssembly = typeof(PracticeManagement.MainWindow).Assembly;
var currentAssembly = this.GetType().Assembly;

Application.ResourceAssembly = targetAssembly;

var rd = (ResourceDictionary)Application.LoadComponent(new Uri("/ProjectName;component/CommonUIStylesDictionary.xaml", UriKind.Relative));

if (Application.Current == null)
{
    var x = new System.Windows.Application(); // magically is assigned to application.current behind the scenes it seems
}

Application.Current.Resources = rd;

var mainWindow = new ProjectName.MainWindow(this.Connection.ConnectionString);

mainWindow.Show();

答案 2 :(得分:2)

似乎创建应用程序类的实例并调用InitializeComponent可以解决问题。

var app = new App(); //magically sets Application.Current
app.InitializeComponent(); //parses the app.xaml and loads the resources