C# 如何使用Rhino mock模拟MEF导出?

C# 如何使用Rhino mock模拟MEF导出?,c#,.net,rhino-mocks,mef,C#,.net,Rhino Mocks,Mef,参考托管可扩展性框架(MEF),我试图解决如何使用mock创建干净的测试 我有一个导出组件,它有三个私有导入。每个导入的对象(字段)都需要模拟。鉴于CompositionContainer使用奇特的反射策略来设置可组合部件的导入私有字段,即使在单元测试中,我也需要使用容器来设置这些字段值 如何在运行时告诉容器接受我用Rhino Mock创建的动态对象作为有效导出,以便它可以用于满足我正在测试的组件中的导入?我的问题已经得到了回答 嗨,内森 这里有两种不同的选择 使用批处理,可以调用AddExp

参考托管可扩展性框架(MEF),我试图解决如何使用mock创建干净的测试

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


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

我的问题已经得到了回答


嗨,内森

这里有两种不同的选择

  • 使用批处理,可以调用AddExportedObject方法将模拟实例添加到容器中。AddExportedObject允许您为正在添加的实例指定约定。i、 e.批处理AddExportedObject(模拟记录器,类型(ILogger))

  • 您还可以创建自定义导出提供程序以允许添加模拟实例。如果您遵循此链接,下面是我使用的一些实用工具。在其中,您可以找到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>();
        }
    
    受保护的覆盖无效上下文()
    {
    MockCache=MockRepository.GenerateStub();
    var元数据=新字典()
    var cacheDefinition=new FakeInstanceExportDefinition(typeof(ICache)、MockCache、元数据);
    FakeProvider=新的FakeExportProvider(f=>((FakeInstanceExportDefinition)f).Instance);
    FakeProvider.AddExportDefinitions(缓存定义);
    CacheExport=FakeProvider.GetExport();
    }
    
    现在我在上面直接查询导出提供程序。但是,我们的容器允许在其构造中传入导出提供程序。所以你可以这样做

    var container=new CompositionContainer(null,FakeProvider)

    嗯 格伦