初学者犀牛模拟问题

时间:2009-01-08 03:12:59

标签: .net rhino-mocks

所以我是犀牛嘲笑的新手,我正试图让它进入我正在进行的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属性的值,我认为期望设置的重点是方法本身从未被调用过?

4 个答案:

答案 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()方法是否正确使用了该视图。

希望这有帮助。