4

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

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

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

4

1 回答 1

5

我的问题已在这里得到解答。


嗨内森

这里有几个不同的选择。

  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).

HTH格伦

于 2009-05-04T17:43:01.437 回答