【问题标题】: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。
嗨内森
这里有几个不同的选项。
使用批处理,您可以调用 AddExportedObject 方法将模拟实例添加到容器中。 AddExportedObject 允许您为要添加的实例指定合同。即batch.AddExportedObject(mockLogger, typeof(ILogger));
您还可以创建自定义导出提供程序以允许您添加模拟实例。如果您点击此链接,这里有一些我使用的实用程序。 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
格伦