我的测试试图断言某个 dal 方法被调用,带有一些参数。
该方法返回一个 DataSet
对象,所以我的 mock 在调用时只返回一个空的 DataSet
。
我遇到的问题是,当 SUT 未使用正确的参数调用 dal 时,模拟将不会返回空的 DataSet
,因此我的类将在尝试访问空引用。这只会导致测试失败,并在我的测试运行程序中显示不相关的消息。
我想在所有情况下对返回空 Dataset
的方法进行 stub ,以便该方法能够正常运行,并在测试结束时验证它是否使用预期参数调用.我要求太多了吗?
最佳答案
假设您的方法有一个 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()
Do
在调用 mock 时执行。它需要一个与模拟方法具有完全相同接口(interface)的委托(delegate)。由于 .NET 2.0 的语法原因,您需要将其转换为正确的委托(delegate)类型,因此您需要先声明它(在本例中为 GetDataSetDelegate
)。
Rhino 3.5 用户注意事项:有一种更方便的调用方式:WhenCalled
只需要一个 lambda 作为参数,但必须以不同的方式实现。
分别使用 Do
或 WhenCalled
,您可以在调用 mock 时实现参数断言。
关于c# - 在犀牛中混合 stub 和模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1124773/