Rhino Mocks默认返回类型?

时间:2012-01-06 11:35:17

标签: c#-4.0 rhino-mocks

为什么Rhino Mocks(v3.6)生成代理类型,当返回类型是接口时,如果明确指定返回值(我知道你应该总是指定一个返回,但这是一个不同的问题)?

许多网络文章,甚至一些SO帖子RhinoMock : Mocks Vs StrictMocks Vs DynamicMocks,假设模拟将返回默认类型作为结果,我假设default(T)。我没有看到这种行为(见下文)。我无法在Rhino Mocks Documentation上找到指定行为的任何内容。

我还测试了(类似于下面的)整数类型和类,作为返回类型,并且这两个测试都抛出异常“需要返回值或抛出异常” ,当我尝试调用方法时,在我的Act代码中。我不介意,它显而易见的是什么错误,而且Rhino并没有'变得富有创造力',尽管它是不稳定的。

// Arrange
IFoo strictMockInstance = MockRepository.GenerateStrictMock<IFoo>();
IFoo dynamicMockInstance = MockRepository.GenerateMock<IFoo>();

strictMockInstance.Expect(call => call.Bar());
strictMockInstance.Replay();

dynamicMockInstance.Expect(call => call.Bar());
dynamicMockInstance.Replay();

// Act
IResult smResult = strictMockInstance.Bar();
IResult dmResult = dynamicMockInstance.Bar();

// Assert    
Assert.IsNull(smResult); // none of these results are null, both are proxy instances
Assert.IsNull(dmResult);

// ....
public interface IFoo 
{
    IResult Bar();
}

public interface IResult { }

1 个答案:

答案 0 :(得分:0)

此功能背后的主要原因是支持(或处理)层次结构

请考虑以下事项:

var mock = MockRepository.GenerateMock<ISomeInterface>();
mock.Expect(x => x.Document.Header.CreateRow());

当Rhino Mocks遇到作为接口的返回类型时,它将检查是否已经创建了一个模拟。如果找不到,它将动态创建一个以防止空异常