gpt4 book ai didi

c# - 在犀牛中混合 stub 和模拟

转载 作者:太空宇宙 更新时间:2023-11-03 16:57:34 27 4
gpt4 key购买 nike

我的测试试图断言某个 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 作为参数,但必须以不同的方式实现。

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

关于c# - 在犀牛中混合 stub 和模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1124773/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com