2012-01-06 69 views
1

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

很多网页文章,甚至SO帖子RhinoMock : Mocks Vs StrictMocks Vs DynamicMocks,都说模拟会返回默认类型作为结果,我会假设default(T)。我没有看到这种行为(见下文)。我无法找到任何指定行为的Rhino Mocks Documentation

我也测试过(与下面类似)整型和类,作为返回类型,并且这两个测试都会抛出异常“我需要返回值或异常抛出”在我的Act代码中调用该方法。我不介意,它显然最新错误,犀牛不'创造',虽然它是不稳定的imo。

// 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 { } 
+0

Offtopic,'Expect()/ Call()'不是您在源代码注释中提到的AAA合成文本,使用'AssertWasCalled() '方法 – sll 2012-01-06 17:57:13

回答

0

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

考虑以下几点:

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

当犀牛嘲笑遇到那是一个接口它会返回类型检查是否已经创建了一个模拟。如果它没有找到一个,它会创建一个以防止空例外