2010-05-01 43 views
2

我試圖嘲弄的Autofac解決方法,如嘲諷Autofac的「決心」擴展與TypeMock

using System; 
using Autofac; 
using TypeMock.ArrangeActAssert; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var inst = Isolate.Fake.Instance<IContainer>(); 
     Isolate.Fake.StaticMethods(typeof(ResolutionExtensions), Members.ReturnNulls); 
     Isolate.WhenCalled(() => inst.Resolve<IRubber>()).WillReturn(new BubbleGum()); 
     Console.Out.WriteLine(inst.Resolve<IRubber>()); 
    } 
} 

public interface IRubber 
{} 

public class BubbleGum : IRubber 
{} 

從起訂量的到來,從TypeMock語法和異常迷惑了我很多。最初在TestMethod中運行它後,我不斷得到一個異常,類似於「WhenCalled無法在沒有補充行爲的情況下運行」。我嘗試爲每個人和他們的母親定義行爲,但無濟於事。

然後我調試通過測試運行,看到一個實際的例外是從Autofac發起的:IRubber尚未註冊。

所以很明顯,靜態的Resolve函數並沒有被僞造,我不能讓它被僞造,不管我怎麼去鉤住它。

Isolate.WhenCalled(() => ResolutionExtensions.Resolve<IRubber>(null)).WillReturn(new BubbleGum()); 

...從Autofac引發異常,抱怨IComponentContext不能爲null。餵它大概假冒的IContainer(或僞造IComponentContext代替)讓我回到「IRubber未註冊」的錯誤。

回答

2

這可能是逆潮流游泳的一種情況 - 創建「真實」容器所需的代碼量以及相應的依賴項已註冊,與TypeMock的配置較少或相似。我建議沿着這條路走下去。

除了目標組件完全依賴IContainer之外,您可以改爲使用像Func這樣的「關係類型」,除了易於模擬以外,它還隱含支持Autofac和更具表現力。 http://nblumhardt.com/2010/01/the-relationship-zoo/有關於該方法的更多信息,與http://code.google.com/p/autofac/wiki/DelegateFactories一樣。

+0

雖然你會如何模仿擁有? – 2011-09-08 17:52:54

+0

當你需要的時候,可以把'擁有的'看作是'List '或'string'這樣的基本類型 - 使用它的構造函數構造'擁有的'的值,可能傳遞一個' T'實例。希望這可以幫助。 – 2011-09-08 20:36:37

+0

對於擁有的類的lifeTime ctor參數,僅通過IDisposable的模擬是否正確?那個參數應該真正的通過什麼?謝謝! – 2011-09-15 14:51:12