簡體   English   中英

如何使用Rhino Mocks模擬MEF導出?

[英]How can I use Rhino Mocks to mock a MEF export?

參考Managed Extensibility Framework(MEF),我正在嘗試研究如何使用模擬創建干凈的測試。

我有一個導出組件,有三個私有導入。 需要模擬每個導入的對象(字段)。 鑒於CompositionContainer使用花式反射策略來設置可組合部件的導入私有字段,即使在單元測試中,我也需要使用容器來設置這些字段值。

如何在運行時告訴容器接受我用Rhino Mocks創建的動態對象作為有效導出,以便它可以用來滿足我正在測試的組件中的導入?

我的問題已在這里得到解答。


嗨Nathan

這里有幾個不同的選擇。

  1. 使用批處理,可以調用AddExportedObject方法將mock實例添加到容器中。 AddExportedObject允許您指定要添加的實例的合同。 即batch.AddExportedObject(mockLogger,typeof(ILogger));

  2. 您還可以創建自定義導出提供程序以允許您添加模擬實例。 如果你按照這個鏈接,這里有一些我使用的工具。 http://pastie.org/467842 你會在其中找到一個FakeExportProvider,以及FakeExportDefinitions。 FakeExportDefinitions為實例采用func。 這意味着您可以將其傳遞給實例,甚至可以直接創建模擬。

這是用於說明用法的示例代碼。

    protected override void Context()
    {
        MockCache = MockRepository.GenerateStub<ICache>();
        var metadata = new Dictionary<string, object> ()
        var cacheDefinition = new FakeInstanceExportDefinition(typeof(ICache), MockCache, metadata);
        FakeProvider = new FakeExportProvider(f => ((FakeInstanceExportDefinition)f).Instance);
        FakeProvider.AddExportDefinitions(cacheDefinition);
        CacheExport = FakeProvider.GetExport<ICache>();
    }

現在我正在直接查詢出口提供商。 但是,我們的容器允許在其構造中傳遞導出提供程序。 所以你可以這樣做......

var container = new CompositionContainer(null,FakeProvider)。

HTH Glenn

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM