1

所以我是 rhino mocks 的新手,我正试图让它在我正在进行的 MVP 模式项目中运行。所以我有一个代表我的视图的接口和我的 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 对象为空。这就是我卡住的地方。我已经调用了Init分配View属性值的方法,并且我认为期望设置的重点是该方法本身从未被调用过?

4

4 回答 4

8

看起来您正在测试 Rhino Mocks。您正在嘲笑视图和演示者。我将假设模拟演示者是不可取的,你应该只模拟视图。

于 2009-01-08T06:37:26.580 回答
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 的观点,即您可能应该只模拟/存根视图而不是演示者。我将保留原始更正以使您的代码正常工作,但更新我的示例以反映后者。

于 2009-01-08T03:24:19.433 回答
0

从我对您的源代码和测试的了解来看,很难看出您实际尝试测试的是什么。风景?主持人?

由于您有视图的接口和演示者的类实现,我认为您想模拟视图并测试演示者。

这是小组网站(我为您发布了指向此问题的链接):

http://groups.google.com/group/RhinoMocks

请参阅此代码。它是从 2007 年开始的,但它可以让您了解嘲笑的要点。

http://tech.groups.yahoo.com/group/AgileEmbedded/files/HomeGuard/

于 2009-01-08T06:23:03.597 回答
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() 方法是否正确使用了视图。

希望这可以帮助。

于 2009-01-08T06:59:59.467 回答