【问题标题】:Beginner Rhino Mock problem初学者犀牛模拟问题
【发布时间】:2009-01-08 03:12:58
【问题描述】:

所以我是 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 方法中得到 null 引用异常(在期望设置期间),因为 View 对象为 null。这就是我卡住的地方。我调用了Init 方法,它分配了View 属性的值,我认为期望设置的重点是该方法本身从未被调用过?

【问题讨论】:

    标签: .net rhino-mocks


    【解决方案1】:

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

    【讨论】:

      【解决方案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 的观点,即您可能应该只模拟/存根视图而不是演示者。我将保留原始更正以使您的代码正常工作,但更新我的示例以反映后者。

      【讨论】:

      • 他正在测试是否调用了 View 属性并且还调用了 DoStuff() 方法。这只是一些演示代码,可以查看 AAA 语法的外观。
      【解决方案3】:

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

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

      这里是小组网站(我在上面为您发布了这个问题的链接):

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

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

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

      【讨论】:

        【解决方案4】:

        正如其他人所写的那样,您需要确定要测试的代码,并且只模拟其他内容。如果您正在尝试测试演示者,那么您只想在仍然使用真实演示者的同时模拟/存根视图。像这样的:

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

        希望这会有所帮助。

        【讨论】:

          猜你喜欢
          • 2011-02-15
          • 1970-01-01
          • 2010-11-07
          • 2010-10-29
          • 2016-06-06
          • 1970-01-01
          • 2011-11-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多