如何测试视图模型是否处于设计器模式,是否在 C# 中

本文关键字:是否 模式 何测试 测试 模型 视图 | 更新日期: 2023-09-27 18:35:47

我是C#和WPF的新手,所以我想从MVVM的书开始。我有一个小型 WPF 应用程序,我想测试我的视图模型是否在设计器模式下创建(检查设计器属性);鉴于我有一个 IDataService,它从硬编码列表(设计时)或 REST 服务(运行时)向 ViewModel 提供数据。

有没有办法模拟或存根此 DesignerProperties 对象以强制它成为一种或另一种状态?

提前谢谢。

如何测试视图模型是否处于设计器模式,是否在 C# 中

有没有办法模拟或存根此设计器属性对象以强制 它应该是一个或另一个状态?

不。它是一个静态类;除非你使用"Microsoft假货"或"类型模拟",否则你不能轻易地嘲笑。

但是你可以为DesignerProperties创建一个抽象,比如说IDesignerProperties它有你感兴趣的方法/属性,然后注入它。这样它现在只是一个界面;您可以像模拟所有其他依赖项一样模拟它。

你可以为静态类创建一个包装器。我不熟悉DesignerProperties类,但我在下面创建了一个示例。还要研究依赖注入/控制反转,以便于单元测试。

静态类

static class DesignerProperties
{
    public bool IsInDesigner { get; }
    public void DoSomething(string arg);
    // Other properties and methods
}

用于依赖注入和模拟的接口。(您可以使用 T4 模板通过反射静态类进行自动生成)

interface IDesignerProperties
{
    bool IsInDesigner { get; }
    void DoSomething(string arg);
    // mimic properties and methods from the static class here
}

运行时使用的实际类

class DesignerPropertiesWrapper : IDesignerProperties
{
    public bool IsInDesigner 
    {
        get { return DesignerProperties.IsInDesigner; } 
    }
    public void DoSomething(string arg)
    {
        DesignerProperties.DoSomething(arg);
    }
    // forward other properties and methods to the static class
}

单元测试的模拟类

class DesignerpropertiesMock : IDesignerProperties
{
    public bool IsInDesigner { get; set; } //setter accessible for Mocking
}

用法

class ViewModel 
{
    private readonly IDesignerProperties _designerProperties;
    // Inject the proper implementation
    public ViewModel(IDesignerProperties designerProperties)
    {
        _designerProperties = designerProperties;
    }
}

我希望这对你有帮助。