如何使用Rhino Mocks模拟MEF导出?

时间:2009-05-04 16:52:16

标签: c# .net rhino-mocks mef

参考Managed Extensibility Framework(MEF),我正在尝试研究如何使用模拟创建干净的测试。

我的导出组件有三个私有导入。需要模拟每个导入的对象(字段)。鉴于CompositionContainer使用花式反射策略来设置可组合部件的导入私有字段,即使在单元测试中,我也需要使用容器来设置这些字段值。

如何在运行时告诉容器接受我用Rhino Mocks创建的动态对象作为有效导出,以便它可以用来满足我正在测试的组件中的导入?

1 个答案:

答案 0 :(得分:5)

我的问题已经回答here


嗨Nathan

这里有几个不同的选择。

  1. 使用批处理,可以调用AddExportedObject方法将mock实例添加到容器中。 AddExportedObject允许您指定要添加的实例的合同。即batch.AddExportedObject(mockLogger,typeof(ILogger));

  2. 您还可以创建自定义导出提供程序以允许您添加模拟实例。如果你按照这个链接,这里有一些我使用的工具。 http://pastie.org/467842。你会在其中找到一个FakeExportProvider,以及FakeExportDefinitions。 FakeExportDefinitions为实例采用func。这意味着你可以传递一个实例,甚至可以直接创建一个模拟。

  3. 以下是用于说明用法的示例代码。

        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 格伦