c# - 单元测试 WPF 中的 ResourceDictionay

标签 c# wpf unit-testing mvvm

我正在为动态创建的 MVVM 风格的插件使用一个基类 我有这个函数,我想调用它来获取 View

public override System.Windows.ResourceDictionary GetViewTemplate()
{
    var dictionary = new ResourceDictionary
    {
        Source = new Uri("/IPDev.Plugins.Calibration.Comment;component/CommentCmcTemplate.xaml",
                       UriKind.RelativeOrAbsolute)
    };
    return dictionary;
}

这是调用我的函数的函数

public CalibrationViewModelBase Load(ProductionProjectVersions productionProjectVersions, IAdditionalDataStorageService additionalDataservice, CalibrationToolVersion calibrationToolVersion) 
{
    var viewModel = GetViewModel(productionProjectVersions, calibrationToolVersion);
    viewModel.Title = GetTitle();            
    viewModel.AdditionalDataService = additionalDataservice;
    viewModel.ConverterFactory = GetConverterFactory(productionProjectVersions);
    ResourceDictionary dict = GetViewTemplate(); //here is the call
    Application.Current.Resources.MergedDictionaries.Add(dict);
    viewModel.HelpTemplate = dict[HELP_TEMPLATE_NAME] as DataTemplate;            
    return viewModel;
}

当然在单元测试中 View 不存在。 你能建议一种方法来克服这个问题吗?

最佳答案

将您的 GetViewTemplate 方法提取到可以模拟的外部依赖项中。例如,创建一个新的 ViewTemplateRepository 类和具有 GetViewTemplate 方法的关联 IViewTemplateRepository 接口(interface)。

在您的运行时代码中,将 ViewTemplateRepository 类实例注入(inject)到调用类中。在您的测试代码中,将 IViewTemplateRepository 的模拟注入(inject)调用类并模拟 GetViewTemplate 方法以返回适当的资源字典。

关于c# - 单元测试 WPF 中的 ResourceDictionay,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40201949/

相关文章:

c# - 使用 async 和 DataRow 的非线程安全代码

c# - Windows Phone IValueConverter 问题

c# - 自动刷新 ICollectionView 过滤器

c# - 在类声明中使用 #ifdef 使实现仅在调试期间可用以进行单元测试

c# - TDD/注入(inject)和信息隐藏之间的斗争 - 可能的妥协?

c# - LINQ 中的 "RemoveAll"怎么可能比迭代快得多?

c# - 如何从 XAML 中的 DataTemplate 引用匹配对象?

wpf - 将两个元素的 Visibility 绑定(bind)到一个属性

c# - 图像到内存慢

unit-testing - 在单元测试中将预期结果与实际结果结合起来是一种不好的做法吗?