在犀牛混合短桩和嘲笑

时间:2009-07-14 11:20:48

标签: c# mocking rhino-mocks

我的测试试图断言某个dal方法被调用,带有一些参数。 该方法返回一个DataSet对象,因此我的模拟只会在调用时返回一个空DataSet

我遇到的问题是,当SUT没有使用正确的参数调用dal时,mock不会返回空的DataSet,所以我的类会在尝试访问null时抛出异常参考。这只会导致测试失败并在我的测试运行器中显示不相关的消息。

我希望将方法存根在所有情况下都返回空Dataset,因此该方法将正常运行,并在测试结束时验证是否使用预期参数调用它。我要求的太多了吗?

2 个答案:

答案 0 :(得分:2)

这应该这样做,假设你的方法有一个int参数。

IDal dalMock = MockRepository.GenerateMock<IDal>();

// setup mock to return the emptyDataSet for any argument    
dalMock
  .Stub(x => x.GetDataSet(Arg<int>.Is.Anything))
  .Return(emptyDataSet)
  .Repeat.Any();

sut.Execute()

// assert that the argument had been 7
dalMock.AssertWasCalled(x => x.GetDataSet(Arg<int>.Is.Equal(7))

Documentation of argument constraints.(我写了这一章,所以你可以问我,如果你不理解; - )


使用.NET 2.0,它看起来像这样:

MockRepository mocks = new MockRepository();
IDal dalMock = mocks.CreateDynamicMock<IDal>();

// expect the correct argument
Expect.Call(dalMock.GetDataSet(Arg<int>.Is.Equal(7)))
  .Return(emptyDataSet)
  .Repeat.Once();

// setup mock to return the emptyDataSet for any argument    
SetupResult.For(dalMock.GetDataSet(Arg<int>.Is.Anything))
  .Return(emptyDataSet)
  .Repeat.Any();

sut.Execute()

// assert that the argument had been 7
mocks.VerifyAll();

不是100%确定它是否有效,但它应该。

你也可以试试这个:

// setup mock to return the emptyDataSet for any argument    
SetupResult.For(dalMock.GetDataSet(Arg<int>.Is.Anything))
  .Do((GetDataSetDelegate)delegate(int i)
    {
      Assert.AreEqual(7, i);
    }
  .Return(emptyDataSet)
  .Repeat.Any();

sut.Execute()
调用mock时执行

Do。它需要一个具有与模拟方法完全相同的接口的委托。由于.NET 2.0的语法原因,您需要将其强制转换为正确的委托类型,因此您需要先声明它(在这种情况下为GetDataSetDelegate)。

注意Rhino 3.5用户:有一种更方便的方法可供调用:WhenCalled只需将lambda作为参数,但必须以不同的方式实现。

分别使用DoWhenCalled,可以在调用mock时实现参数断言。

答案 1 :(得分:-2)

您是否尝试过使用Rhino Mocks的部分模拟,如here所述。我想如果你这样做那么你会得到你想要的东西。