我的测试试图断言某个dal方法被调用,带有一些参数。
该方法返回一个DataSet
对象,因此我的模拟只会在调用时返回一个空DataSet
。
我遇到的问题是,当SUT没有使用正确的参数调用dal时,mock不会返回空的DataSet
,所以我的类会在尝试访问null时抛出异常参考。这只会导致测试失败并在我的测试运行器中显示不相关的消息。
我希望将方法存根在所有情况下都返回空Dataset
,因此该方法将正常运行,并在测试结束时验证是否使用预期参数调用它。我要求的太多了吗?
答案 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作为参数,但必须以不同的方式实现。
分别使用Do
或WhenCalled
,可以在调用mock时实现参数断言。
答案 1 :(得分:-2)
您是否尝试过使用Rhino Mocks的部分模拟,如here所述。我想如果你这样做那么你会得到你想要的东西。