2009-05-04 64 views
4

参考托管扩展性框架(MEF),我试图找出如何使用mock创建干净的测试。我如何使用Rhino Mocks来模拟MEF导出?

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

我如何告诉容器在运行时间接受我和犀牛嘲笑创建为一个有效的出口动态对象,以便它可以用来满足我测试组件的进口?

回答

5

我的问题已经回答了here


森喜

有几个不同的选择这里。

  1. 使用批处理,您可以调用AddExportedObject方法来向容器添加模拟实例。 AddExportedObject允许您为正在添加的实例指定合约。即batch.AddExportedObject(mockLogger,typeof(ILogger));

  2. 您的还可以创建一个自定义的出口供应商允许你添加模拟实例。如果你按照这个链接,这里有一些我使用的utils。 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集装箱=新CompositionContainer中(空,FakeProvider)。

HTH Glenn