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

标签 c# mocking rhino-mocks

我的测试试图断言某个 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/

相关文章:

c# - 在没有公共(public)构造函数的情况下模拟密封类?

c# - 犀牛模拟 : How do I return numbers from a sequence

C#:使用锁会阻塞以后的调用。

c# - 如何使用 .net 读取包含 2900 万行数据的巨大 CSV 文件

c# - 如何创建文件路径,以便在任何 PC 上找到正确的文件?

mocking - 使用模拟 HttpMessageHandler 时如何使用 HttpClient 管理 cookie

c# - 使用 SWIG 从 C++ 生成 C# 接口(interface)

c# - 如何在c#中使用moq.mock模拟调用静态类的方法

c# - Rhino.Mocks : method calls recorder (a. k.a.测试 spy )

c# - 将 IntPtr 指向的内存内容发送到 C# 上的 MemoryStream 变量