C# 我应该如何使用Moq';对我的WebFormMVP演示者进行单元测试;使用监控控制器模式时的三维视图

C# 我应该如何使用Moq';对我的WebFormMVP演示者进行单元测试;使用监控控制器模式时的三维视图,c#,asp.net,unit-testing,moq,webformsmvp,C#,Asp.net,Unit Testing,Moq,Webformsmvp,我正在尝试测试使用ASP.NET WebFormsMVP创建的演示者。我使用“监控控制器”模式构建它,因此视图负责从模型中更新自身。我简化了下面一个带有文本框、按钮和标签的页面示例。输入文本框并按下按钮,然后输入文本HelloWorld被放在标签上 下面是示例代码,但简而言之: 单击按钮将引发视图事件 演示者订阅此ViewEvent并捕获参数(即消息) 演示者执行工作(字符串连接)并更新模型 视图重新绑定到Model.Message属性&一切正常 但除非我明确地将模型的消息属性标记为virtu

我正在尝试测试使用ASP.NET WebFormsMVP创建的演示者。我使用“监控控制器”模式构建它,因此视图负责从模型中更新自身。我简化了下面一个带有文本框、按钮和标签的页面示例。输入文本框并按下按钮,然后输入文本
HelloWorld被放在标签上

下面是示例代码,但简而言之:

  • 单击按钮将引发视图事件
  • 演示者订阅此ViewEvent并捕获参数(即消息)
  • 演示者执行工作(字符串连接)并更新模型
  • 视图重新绑定到Model.Message属性&一切正常
  • 但除非我明确地将模型的
    消息
    属性标记为virtual,否则这是行不通的,我真的不想这么做。e、 g

    //Model
    public class HelloWorldModel {
        public string Message { get; set; }
    }
    
    我的另一个选择是使用被动视图模式,在IHelloWorldView上将asp:label文本作为字符串属性公开,并直接从Presenter设置它。。。然后我就可以测试它了

  • 从测试的角度来看,被动观点是更好的方法吗
  • 我是否有必要也模仿我的模型(我不确定在WebFormsMVP中是否可行)? 或
  • 我需要将模型的所有属性都虚拟化 或
  • 我是不是在什么地方漏掉了要点

  • 您正在使用DefaultValue.mock设置视图模拟,因此您的视图将具有初始化的模型属性。不使用Moq检查模型的值,只需直接检查模型上的消息:

    Assert.That(mock.Object.Model.Message, Is.EqualTo(expected));
    

    这个小的(但语义上相等)的美变化是你的模拟突然变成了存根,你正在测试最终结果,而不是具体的实现细节。至于你的问题,从可测试性的角度设计你的系统是一件好事,但我不会开始虚拟化或接口一切,只是为了使它对Moq友好;制作一个坚实的体系结构,而不是必要的Moq可以。

    谢谢。这简化了事情。
    //Model
    public class HelloWorldModel {
        public string Message { get; set; }
    }
    
    Assert.That(mock.Object.Model.Message, Is.EqualTo(expected));