C# 使用RhinoMock进行单元测试:从切入预期调用语句调用方法

C# 使用RhinoMock进行单元测试:从切入预期调用语句调用方法,c#,unit-testing,rhino-mocks,C#,Unit Testing,Rhino Mocks,实际上,我正在编写单元测试,为此我使用Rhinomock 测试方法: { ... var classA = repo.StrictMock<IMyInterface>(); Expect.Call(()=>classA.AddItem()). // call here method cuT.ItemAdded() repo.ReplayAll(); // test cuT.DoSomething(classA); ... } 我的

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

测试方法:

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

   // test
   cuT.DoSomething(classA);

   ...
}
我的问题是,如何定义Expect.Call()语句,以便通过调用接口上的预期方法AddItem()调用cuT.ItemAdded()

提前感谢您的帮助

问候,,
rhe1980

这里您真正想要的是两个测试,因为使用事件表明可以从不同的来源添加项目(而不是
DoSomething
方法):

//1:此测试将只验证被测试的方法调用依赖项
public void DoSomething_AddsItemOnMyInterface()
{
var myInterface=MocksRepository.GenerateMock();
Expect(m=>m.AddItem()).Repeat.Once();
切割.剂量测定(myInterface);
myInterface.VerifyAllExpections();
}
//2:在这里,我们保证在添加项目时更新模型
公共无效项已添加\u更新模型\u WhenMyInterfaceRaiseEvent()时
{
var myInterface=MocksRepository.GenerateMock();
Expect(m=>m.AddItem()).Repeat.Once();
myInterface.Raise(m=>m.ItemAddedEvent+=null,myInterface,
新的ItemEventArgs());
//在引发事件时,模型是如何更新的
//应该在这里断言。
}
例如,如果
UpdateModel
正在将您的类属性设置为某个值,您将断言该值。如果它正在清除某个集合,那么在assert中,您将检查集合是否为空。从测试的角度来看,事件本身并不有趣(将其视为一种<强>条件<强>);有趣的是当该事件被引发时会发生什么(合同)。测试应该检查合同是否确实发生了什么


顺便说一句,您使用的语法(录制重播)有点旧。Rhino现在支持更流畅的Arrange-Act-Assert语法(使用
Expect
Stub
Verify
方法)。更多信息可以在wiki页面上找到。

我假设您想要测试正在引发的ItemAdded事件。对吗?可能想看看这个:@jimmy_keen:你是对的,事实上有两个测试。我还做了两个单独的测试。我遇到的问题有点复杂,我只想在这里尽可能简单地描述:-)。事实上,ItemAdded()方法必须更新模型,但只有在由于IddItem()调用而未引发该方法的情况下。我将更新我的问题,以便更容易地解释:-)。但是也要感谢新的Rhino语法。@rhe1980:如果是这样,第二个测试应该在
UpdateModel
之后验证CUT的状态(不管是什么,如果可以进行这样的验证)。参见我的编辑(尤其是最后一段的旁边)。没有更多的背景,很难回答你到底应该做什么。
{
   ...
   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()..
     ...
   }
}
// 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.
}