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

4
关于托管可扩展框架(MEF),我正在尝试如何使用模拟来创建干净的测试。 我有一个已导出的组件,其中有三个私有导入。 每个导入的对象(字段)都需要被mock。 鉴于CompositionContainer使用花哨的反射策略来设置可组合部件的导入私有字段,即使在单元测试中,我也需要使用容器来设置那些字段的值。
我该如何告诉容器在运行时接受我使用Rhino Mocks创建的动态对象作为有效的导出,以便它可以用来满足我正在测试的组件中的导入?
1个回答

5

我的问题在这里得到了回答。


你好,Nathan

这里有几个不同的选择。

  1. 使用批处理,您可以调用AddExportedObject方法向容器添加模拟实例。 AddExportedObject允许指定您要添加的实例的合同。例如:batch.AddExportedObject(mockLogger, typeof(ILogger));

  2. 您还可以创建自定义导出提供程序以允许您添加模拟实例。如果您跟随此链接,这里是一些我使用的实用程序。http://pastie.org/467842。您将在其中找到FakeExportProvider以及FakeExportDefinitions。 FakeExportDefinitions接受一个函数作为实例。这意味着您可以传递它一个实例,甚至直接创建一个模拟实例。

以下是说明如何使用的示例代码。

    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).
希望对你有帮助。
谢谢,Glenn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接