2011-09-03 142 views
0

我已經開始使用UnityAutoMoqContainer Here is the Link 並且我特別在container.GetMock()調用周圍有2個以下的問題。通過UnityAutoMoqContainer解決依賴關係

  1. 我期待下面的斷言取得成功,但它會引發異常。

    private UnityAutoMoqContainer container; 
    
    [SetUp] 
    public void SetUp() 
    { 
        container = new UnityAutoMoqContainer(); 
    } 
    
    [Test] 
    public void Are_mocks_Same(){ 
    
        var serviceMock = new Mock<IService>(); 
        var getMock = container.GetMock<IService>();    
        Assert.AreSame(getMock, serviceMock); 
    } 
    

錯誤1個測試 'UnityAutoMoq.Tests.UnityAutoMoqContainerFixture.Are_mocks_Same' 失敗:預期:同在 UnityAutoMoq.Tests.UnityAutoMoqContainerFixture.Are_mocks_Same()在 C:\用戶... ...。

那麼爲什麼當「預期」和「但是」是相同的,它仍然會引發異常?

我看到不同的是,GetMock使用統一解決I,E 解決()依賴性,其中新的模擬沒有。但我無法解釋我自己造成這種例外的原因。

  1. 解決抽象類型:

    我用Moq.Mock到如下解決抽象類型。

    var httpContextBaseMock = new Mock<HttpContextBase>(); 
    

但是下面的調用UnityAutoMoqContainer拋出該異常:

 var mock = container.GetMock<HttpContextBase>(); 

依賴解析失敗,類型= 「System.Web.HttpContextBase」,名字=「 (沒有)」。同時發生異常 :解決。異常是:InvalidOperationException - 無法構造類型爲HttpContextBase的 。您必須配置 容器才能提供此值。

問題是爲什麼容器不便於返回一個模擬抽象類型?

回答

1

AreSame方法測試相同的對象被兩個參數引用。當你做

var serviceMock = new Mock<IService>(); 
var getMock = container.GetMock<IService>(); 
Assert.AreSame(getMock, serviceMock); 

創建不同的對象,他們將永遠是相同的參考。 automoc容器無法知道您在不使用容器的情況下創建的實例。但是,這將成功:

var mock1 = container.GetMock<IService>(); 
var mock2 = container.GetMock<IService>(); 
Assert.AreSame(mock1, mock2); 

不能從抽象類型創建模擬是一個錯誤,但應該立即修復。如果你更新到v2.1.0,它應該有希望按預期工作。

希望這會有所幫助!

-Thomas