2010-08-19 12 views
1

我在TypeMock論壇上發佈了這個,但我太急於等待那裏的響應。這是一個非常困難的問題。在一個方法上設置行爲似乎是調用方法

我試圖設置一個假IContainer。下面是我有:

var container = Isolate.Fake.Instance<IContainer>(); 
var program = Isolate.Fake.Instance<IProgram>(); 

Isolate.WhenCalled(() => container.Resolve<IProgram>()).WillReturn(program); 

IProgram是在我的代碼的接口)。

當我嘗試運行此代碼時,出現Autofac異常:「請求的服務MyApp.IProgram尚未註冊。」

這個異常怎麼會引發?我實際上並沒有調用container.Resolve(),對吧?我只是設置它返回一個假的IProgram。

無關的背景信息:我正在試用TypeMock,因爲Autofac廣泛使用擴展方法,而Moq不會嘲笑它們。

回答

3

有幾件事可能會有所幫助 - 首先,您可以通過設置IComponentContext.Resolve()來模擬Resolve()與Moq的呼叫,其中所有擴展方法委託給該呼叫。

其次,Autofac的設計使您不必使用組件的接口。見例子:

如果你需要使用(並因此模擬)​​或類似的界面,您可以使用可能會做同樣的事情Func,IIndex和/或Owned關係類型。

希望這會有所幫助! 尼克

+0

哦咄!我應該更看重我最初的問題。問題已解決。非常感謝Nicholas!實際上,我在應用程序中的一個位置傳遞了一個ContainerBuilder,只是爲了引導程序,並且希望確保它能夠正確註冊我的模塊。 – 2010-08-19 09:00:21

2

不幸的是,目前在隔離器中有一個錯誤,它可以防止僞造Autofac容器。我們正在努力盡快解決它。

與此同時,有沒有你不使用Autofac如預期的理由,意義有它返回一個假的情況下,如:

[TestFixture] 
public class TestClass 
{ 
    private ContainerBuilder builder; 
    private IContainer container; 

    [SetUp] 
    public void SetUp() 
    { 
     builder = new ContainerBuilder(); 
    } 

    [Test, Isolated] 
    public void Test1() 
    { 
     var fakeProgram = Isolate.Fake.Instance<IProgram>(); 

     builder.RegisterInstance(fakeProgram).As<IProgram>(); 
     container = builder.Build(); 

     var program = container.Resolve<IProgram>(); 

     Assert.AreEqual(fakeProgram, program); 
    } 
} 
+0

感謝您的回答hmemcpy!我會這樣做,但我實際上也是在僞裝構建器,因爲它是引導程序的傳入依賴項。 – 2010-08-19 08:57:57

相關問題