RhinoMock:如何使用复杂对象作为参数存根和返回方法

Und*_*ity 6 rhino-mocks mocking stub

我非常感谢任何人都能在下面提到的问题上帮助我:我一直在单元测试中使用RhinoMock.我以这种方式定义我的模拟对象,sessionToken是字符串类型的:

mockRepository.Stub(repository => repository.FindById(sessionToken)).Return(new DeviceTypeRepository().NewTable(false));
Run Code Online (Sandbox Code Playgroud)

调用FindById()以返回有效的新的新DeviceTypeRepository()时,代码部分是可以的.NewTable(false);

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

mockRepository.Stub(repository => repository.Find(sessionToken, dataTable)).Return(new DeviceTypeRepository().NewTable(false));
Run Code Online (Sandbox Code Playgroud)

然后,在该代码段查找()被调用时,它返回预期的新DeviceTypeRepository().newtable的(假).请注意,参数dataTable的输入值在Stub和Find()调用中都是相同的.

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

sll*_*sll 9

我认为问题不在于复杂的数据类型,而在于您设定的期望值.

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

...Stub(...).IgnoreArguments().Return();
Run Code Online (Sandbox Code Playgroud)

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

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

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


Ami*_*ira 6

如果它没有返回您期望的内容,那么存根调用和实际调用之间的参数不匹配.假设你有这样的事情:

// 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);
Run Code Online (Sandbox Code Playgroud)

这里的事情,即使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);
Run Code Online (Sandbox Code Playgroud)