【问题标题】:RhinoMock : How to Stub and Return a method with complex object as parameterRhinoMock:如何存根并返回具有复杂对象作为参数的方法
【发布时间】:2011-10-14 06:55:49
【问题描述】:

我非常感谢任何人可以帮助我解决以下问题: 我一直在单元测试中使用 RhinoMock。 我以这种方式定义了我的模拟对象,其中 sessionToken 是字符串类型的:

mockRepository.Stub(repository => repository.FindById(sessionToken)).Return(new DeviceTypeRepository().NewTable(false));

调用FindById()返回valid new new DeviceTypeRepository().NewTable(false);

但是,当将复杂参数作为对象(例如 DataTable)包含到 Stub 中时,如下所示:

mockRepository.Stub(repository => repository.Find(sessionToken, dataTable)).Return(new DeviceTypeRepository().NewTable(false));

然后调用 Find() 的代码部分,它确实 NOT 返回预期的新 DeviceTypeRepository().NewTable(false)。 请注意,参数 dataTable 的输入值在 Stub 和 Find() 调用中是相同的。

因此,我的问题是: 我如何使用 RhinoMock 将这样的参数(DataTable 类型化和更一般的)实现到 Stub 初始化中?我将不胜感激任何建议和方法。 谢谢

【问题讨论】:

  • dataTablevaluereferenceStub()Find() 中是否相同?

标签: mocking rhino-mocks stub


【解决方案1】:

我相信问题不在于复杂的数据类型,而在于您设定的期望。

作为第一次尝试修复它,在Return 之前添加IgnoreArguments()。可能是您在期望中指定的 DataTable 与实际传入的 DataTable 实例不同,因此期望不会通过:

...Stub(...).IgnoreArguments().Return();

如果没有帮助,您可以使用 WhenCalled() 手动调试它:

...Stub(...).IgnoreArguments().WhenCalled(
    mi => 
    {
        var token = mi.Arguments[0] as TokenDataType;
        var dataTable = mi.Arguments[1] as DataTable;
    }).Return();

如果这没有帮助,请尝试在Return() 之后添加Repeat().Any() 并查看它是否有效。我假设如果方法被调用了几次,你可能错过了第一个返回值,但我可能错了。

【讨论】:

  • 我喜欢WhenCalled 的用法。但是,使用 Stub,您不需要添加 Repeat().Any(),这是默认行为。
  • @Amittai Shapira :好点,谢谢,有文档参考吗?我主要使用 Mock,而对于 mock,默认情况下它不会重复
  • 感谢您提供证据。我错了:-(在这种情况下模拟和存根的行为是相似的,默认是Repeat().Once():groups.google.com/group/rhinomocks/browse_thread/thread/…
  • 我遇到了同样的问题,通过添加 .IgnoreArguments().Return 解决了我的问题。谢谢!!
【解决方案2】:

如果它没有返回您期望的结果,那么存根调用和实际调用之间的参数不匹配。假设你有这样的东西:

// Set expectations
var someDataTable = new DataTable(columns, raws);
mockRepository
   .Stub(repository => repository.Find(sessionToken, dataTable))
   .Return(new DeviceTypeRepository().NewTable(false));

// Actual test
var anotherDataTable = new DataTable(columns, raws);
yourTestObject.DoSomethingThatLooksForTheDataTable(repository);

即使someDataTableanotherDataTable 具有完全相同的内容,它们也不是同一个对象,并且当RhinoMocks 将存根调用与实际调用进行比较时,参数不匹配。你可以做的是使用约束:

mockRepository
   .Stub(repository => repository.Find(
      Arg<SessionID>.Matches(y => y.ID == 2),
      Arg<DataTable>.Matches(x => x.Columns == columns && x.Raws == raws)
   ))
   .Return(true);

【讨论】:

  • 有没有其他方法可以使用 RhinoMock 的 Contraints ?类似的东西:mockRepository.Stub(repository => repository.Find(..., ...)).Contraints(Is.EqualTo(x), ...)
猜你喜欢
  • 2018-03-22
  • 1970-01-01
  • 1970-01-01
  • 2012-04-11
  • 2019-11-23
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
相关资源
最近更新 更多