【问题标题】:How can I use Rhino Mocks to mock a MEF export?如何使用 Rhino Mocks 模拟 MEF 导出?
【发布时间】:2009-05-04 16:52:15
【问题描述】:

参考托管可扩展性框架 (MEF),我正在尝试研究如何使用模拟创建干净的测试。

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

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

【问题讨论】:

    标签: c# .net rhino-mocks mef


    【解决方案1】:

    我的问题已经回答here


    嗨内森

    这里有几个不同的选项。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多