使用 RhinoMock 进行单元测试:在预期的调用语句中从 CuT 调用方法

本文关键字:调用 语句 方法 CuT RhinoMock 单元测试 使用 | 更新日期: 2023-09-27 18:36:37

实际上我正在编写单元测试,为此我使用RhinoMocks。

测试方法:

{
   ...
   var classA = repo.StrictMock<IMyInterface>();
   Expect.Call(()=>classA.AddItem()). // call here method cuT.ItemAdded()
   repo.ReplayAll();
   // test
   cuT.DoSomething(classA);
   ...
}

测试类:

{
   ...
   public void DoSomething(IMyInterface myInterface)
   {
      myInterface.AddItem();
   }
   public void ItemAdded(object sender, ItemEventArgs e)
   {
     UpdateModel(); // update model only if item wasn't added by AddItem() method called from DoSomething()..
     ...
   }
}

我的问题是,我必须如何定义 Expect.Call() 语句,以便通过在接口上调用预期方法 AddItem() 来引发对 cuT.ItemAdd() 的调用。

提前感谢您的帮助!

问候瑞仕1980

使用 RhinoMock 进行单元测试:在预期的调用语句中从 CuT 调用方法

您真正想要的是两个测试,因为使用 event 表示添加项目可以从不同的来源(而不是DoSomething方法)发生:

// 1: This test will simply verify that tested method calls dependency
public void DoSomething_AddsItemOnMyInterface()
{
    var myInterface = MocksRepository.GenerateMock<IMyInterface>();
    myInterface.Expect(m => m.AddItem()).Repeat.Once();
    cut.DoSomething(myInterface);
    myInterface.VerifyAllExpectations();
}
// 2: Here we assure that model gets updated when item was added
public void ItemAdded_UpdatesModel_WhenMyInterfaceRaisesEvent()
{
    var myInterface = MocksRepository.GenerateMock<IMyInterface>();
    myInterface.Expect(m => m.AddItem()).Repeat.Once();
    myInterface.Raise(m => m.ItemAddedEvent += null, myInterface,
        new ItemEventArgs());
    // How exactly model is updated when event is raised? The 'how'
    // should be asserted here.
}

例如,如果UpdateModel将类属性设置为某个值,则可以断言该值。如果它正在清除某些集合,则断言您将检查集合是否为空。从测试的角度来看,事件本身并不有趣(将其视为一个条件);有趣的是,当引发该事件时会发生什么合同)。并且测试应该检查合同确实发生了什么。

顺便说一句,您使用的语法(记录重播)有点旧。Rhino 现在支持更流畅的 Arrange-Act-Assert 语法(使用 ExpectStubVerify 方法)。更多可以在维基页面上找到 这里.