我看过使用TDD和MVP模式的视频来创建一个小应用程序。此视频显示在此处:
该视频使用了Rhino Mocks,任何人都可以了解如何使用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
答案 0 :(得分:0)
如果Init()没有产生任何理想的输出,我就不会在GuiPresenter上测试Init方法了。
你想测试什么?
答案 1 :(得分:0)
我想测试一下GUI UpdateFromDataSource事件是否有一个有线处理程序。所以我希望能够创建一个GUI模型,并测试当Init被调用Gui Mock对象时 UpdateFromDataSource至少有一个事件处理程序。
我想对此视频中的那个进行类似的测试。 http://blog.jpboodhoo.com/content/binary/appliedTestDrivenDevelopmentPart3/appliedtestdrivendevelopmentpart3.swf
该视频使用的是Rhino Mock而不是Moq!
答案 2 :(得分:0)
我对基于类似事件的方法有不好的经验。正如你所发现的那样,模拟和测试更难,但是你也在用更难的代码替换更容易的代码而没有真正获得任何东西:你仍然必须编写粘合代码来激活这些事件。如果没有正确发布事件,事件也可能变成内存泄漏,或者因为在代码中导航更难而导致讨厌的错误。
我发现将这些事件转换为presenter方法更容易,让视图直接调用它们。它更容易测试,并且编写针对模拟的测试更加困难,这是毫无意义的。
答案 3 :(得分:0)
因此,您要测试Init是否将View的事件连接到演示者中的相应处理程序。
我会创建
mockView.Raise( m => m.UpdateDataSource()+= null )
//something
)时应该发生的演示者状态更改