所以我是犀牛嘲笑的新手,我正试图让它进入我正在进行的MVP模式项目。所以我有一个代表我的View的界面和我的Presenter的类,如下所示:
public interface IView {
string SomeData { get; set; }
}
public class Presenter {
public IView View { get; set; }
public void Init(IView view) {
this.View = view;
}
public virtual string DoStuff(){
return "Done stuff with " + this.View.SomeData;
}
}
我正在尝试设置一个模拟DoStuff
方法的测试,所以我有一个像这样的基本夹具:
[TestMethod]
public void Test(){
var mocks = new MockRepository();
var view = mocks.Stub<IView>();
var presenter = mocks.StrictMock<Presenter>();
presenter.Init(view);
using(mocks.Record()){
presenter.Expect(p => p.DoStuff()).Return("Mocked result");
}
string result = string.Empty;
using(mocks.Playback()){
result = presenter.DoStuff();
}
Assert.AreEqual(result, "Mocked result");
}
但是我一直在DoStuff
方法中(在期望设置期间)获得空引用异常,因为View对象为null。这就是我被困住的地方。我调用Init
方法,它赋予View
属性的值,我认为期望设置的重点是方法本身从未被调用过?
答案 0 :(得分:8)
看起来你正在测试Rhino Mocks。 您正在嘲笑视图和演示者。 我将假设模仿主持人不是理想的,你应该只模仿视图。
答案 1 :(得分:2)
您还需要模拟View属性,而不是在模拟的演示者上调用Init方法。
presenter.Expect( p => p.View ).Return( view );
您可能还想查看为RhinoMocks使用新的AAA(Arrange-Act-Assert)语法。
string expectedResult = "Done stuff with Mocked Result";
var view = MockRepository.GenerateMock<IView>();
view.Expect( v => v.SomeData ).Return( "Mocked Result" );
var presenter = new Presenter();
presenter.Init( view );
string actualResult = presenter.DoStuff();
Assert.AreEqual( expectedResult, actualResult );
view.VerifyAllExpectations();
编辑再次查看此内容后,我同意@ayende您可能只应该模拟/存根视图而不是演示者。我将保留原始更正以使您的代码正常工作,但更新我的示例以反映后者。
答案 2 :(得分:0)
从我看到的源代码和测试结果来看,您很难看到实际尝试测试的内容。风景?主持人?
由于您的视图界面和演示者的类实现,我认为您想模拟视图并测试演示者。
这是小组网站(我在网上发布了这个问题的链接):
http://groups.google.com/group/RhinoMocks
请参阅此代码。它是从2007年开始的,但它可以为你提供嘲弄的要点。
http://tech.groups.yahoo.com/group/AgileEmbedded/files/HomeGuard/
答案 3 :(得分:0)
正如其他人所写的那样,您需要确定您要测试的代码,并仅模拟其他内容。如果您正在尝试测试演示者,那么您只想在仍使用真实演示者的同时模拟/删除视图。像这样:
[TestMethod]
public void Test(){
var view = MockRepository.GenerateStub<IView>();
var presenter = new Presenter();
presenter.Init(view);
view.SomeData = "Test";
Assert.AreEqual(presenter.DoStuff(), "Done stuff with Test");
}
然后,您正在测试Presenter.DoStuff()方法是否正确使用了该视图。
希望这有帮助。