【问题标题】:How to write unit tests that use MVVM Light's Messenger?如何编写使用 MVVM Light 的 Messenger 的单元测试?
【发布时间】:2023-04-06 17:53:02
【问题描述】:

我正在为使用 MVVM Light 的 Messenger 的 WPF 应用程序编写一些单元测试。我们有几种类似的方法:

private void ExecuteViewTemplatesCommand()
{
    OpenViewMessage message = new OpenViewMessage();
    CurrentViewModel = message.ViewModel = ViewModelLocator.TemplateVM;
    Messenger.Default.Send<OpenViewMessage>(message);
}

我认为我必须编写单元测试来对抗运行 void 类型的方法所产生的副作用,例如在本例中将消息分配给 Messenger 对象的属性。请问我该如何针对这种情况进行单元测试?

【问题讨论】:

  • 如果您使用该库,您应该确信Messenger 工作得很好。在 UT 中,您只测试最小的单元,没有消息,这还不够吗?
  • 我明白你的意思@LeiYang。我正在寻找增加代码覆盖率。
  • 那你还会介绍 WPF 绑定系统,你怎么能相信当你的 viewmodel 改变时,UI 会改变?

标签: c# wpf unit-testing mvvm-light


【解决方案1】:

要为 mvvm light 编写单元测试,您需要先注册消息,并知道何时发送消息 假设您的视图模型中有 2 个不紧密耦合的类,我们将它们称为 classA 和 classB。这是可用于注册和发送消息的过程。

ClassA //register the message
{
          MessengerInstance.Register<//in here you can put the class that you want to register, for the sake to simplify the example, we'll introduce this as classC>(this, DelegateFunctionHanlder);
}

private void DelegateFunctionHanlder(classC message)
{
    //in here, we'll do something
}

然后你需要将classC创建为一个messageclass,这将充当中介类,它是一个messenger

namespace something
{
    public class ClassC
    {
        //it can be blank
    }
}

然后创建一个ClassB

ClassB
{
    classC _classCMessage = new classC();
    MessengerInstace.Send(_classCMessage);

}

这里的重点是,所有这些都阻止了 ClassA 直接与 ClassB 对话,原因是我们尽量避免任何类型的依赖,假设 classB 是一个 WPF 框架,我们将尽量避免依赖它,以防万一有一天你决定切换到不同的框架

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 2015-09-18
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    相关资源
    最近更新 更多