C# 使用MOQ的TDD模型视图演示器

C# 使用MOQ的TDD模型视图演示器,c#,tdd,moq,C#,Tdd,Moq,我看过一个使用TDD和MVP模式创建小型应用程序的视频。此视频如下所示: 这段视频使用了犀牛模型,有谁能解释一下如何使用MOQ进行同样的测试 因此,如果我有下面的代码,我将如何使用MOQ编写测试来测试Init方法 public interface IGui { event eventhandler UpdateFromDataSource; } public class Gui :IGui { button.Click += delegate { UpdateFromDataS

我看过一个使用TDD和MVP模式创建小型应用程序的视频。此视频如下所示:

这段视频使用了犀牛模型,有谁能解释一下如何使用MOQ进行同样的测试

因此,如果我有下面的代码,我将如何使用MOQ编写测试来测试Init方法

public interface IGui
{
   event eventhandler UpdateFromDataSource;
} 

public class Gui :IGui
{
   button.Click += delegate { UpdateFromDataSource(); }   
}

public class GuiPresenter
{
    IGui gui;
    public GuiPresenter(IGui gui)
    {
       this.gui = gui;
    }

    public Init()
    {
        gui.UpdateFromDataSource += delegate {//something};
    }
}
谢谢


CA

如果Init没有产生任何理想的输出,我就不会在GuiPresenter上测试Init方法


你想测试什么

我想测试GUI UpdateFromDataSource事件是否有一个有线处理程序。因此,我希望能够创建一个GUI模拟,并测试当调用Init时,GUI模拟对象 UpdateFromDataSource至少有一个事件处理程序

我想做一个与本视频中类似的测试


该视频使用犀牛模拟而非Moq

我对基于类似事件的方法有不好的经验。正如您所发现的,模拟和测试比较困难,但是您也在用较难的代码替换较容易的代码,而没有真正获得任何东西:您仍然需要编写粘合代码来激活这些事件。如果不正确地释放,事件也可能会变成内存泄漏,或者是令人讨厌的bug,因为在代码中很难导航


我发现将这些事件转换为presenter方法并让视图直接调用它们更容易。测试更容易,针对mock编写测试也更难,这是毫无意义的。

因此,您需要测试Init是否将视图的事件连接到presenter中相应的处理程序

我会创造

模拟风景 将其传递到presenter实例中 引发模拟事件,例如mockView.raisem=>m.UpdateDataSource+=null 验证如果处理程序//调用了某个对象,则演示程序中应发生的状态更改
您可以始终将事件强制转换为委托,然后断言有多少个委托。不记得要使用的确切成员,但我知道他们在那里。也就是说,这些测试只验证事件是否有侦听器。你仍然不知道他们是否是正确的听众,或者他们是否做了正确的事情。测试结果:单击按钮时,您希望发生什么。忘了那个视频吧,那只是众多方法中的一种。