[英]How can I use Rhino Mocks to mock a MEF export?
參考Managed Extensibility Framework(MEF),我正在嘗試研究如何使用模擬創建干凈的測試。
我有一個導出組件,有三個私有導入。 需要模擬每個導入的對象(字段)。 鑒於CompositionContainer使用花式反射策略來設置可組合部件的導入私有字段,即使在單元測試中,我也需要使用容器來設置這些字段值。
如何在運行時告訴容器接受我用Rhino Mocks創建的動態對象作為有效導出,以便它可以用來滿足我正在測試的組件中的導入?
我的問題已在這里得到解答。
嗨Nathan
這里有幾個不同的選擇。
使用批處理,可以調用AddExportedObject方法將mock實例添加到容器中。 AddExportedObject允許您指定要添加的實例的合同。 即batch.AddExportedObject(mockLogger,typeof(ILogger));
您還可以創建自定義導出提供程序以允許您添加模擬實例。 如果你按照這個鏈接,這里有一些我使用的工具。 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.