编程语言
首页 > 编程语言> > c# – 如何使用Rhino Mocks模拟MEF导出?

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

作者:互联网

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

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

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

解决方法:

我的问题已经回答了here.

嗨Nathan

这里有几个不同的选择.

>使用批处理,可以调用AddExportedObject方法将mock实例添加到容器中. AddExportedObject允许您指定要添加的实例的合同.即batch.AddExportedObject(mockLogger,typeof(ILogger));
>您还可以创建自定义导出提供程序以允许您添加模拟实例.如果你按照这个链接,这里有一些我使用的工具. http://pastie.org/467842.你会找到一个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>();
    }

现在我正在直接查询出口提供商.但是,我们的容器允许在其构造中传递导出提供程序.所以你可以这样做……

var container = new CompositionContainer(null,FakeProvider).

HTH
格伦

标签:c,net,mef,rhino-mocks
来源: https://codeday.me/bug/20190622/1260456.html