2012-01-06 99 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()); 

當犀牛嘲笑遇到那是一個接口它會返回類型檢查是否已經創建了一個模擬。如果它沒有找到一個,它會創建一個以防止空例外