C# 如何模拟MEF出口工厂<;TGeneric>;使用Moq实例?
如何使用IMyType[T](本身就是一个通用接口)的模拟来模拟托管可扩展性框架(MEF)导入到ExportFactory[IMyType[T]]中?或者,一般来说,指定ExportFactory返回的实例,而这些实例不能单独使用构造函数创建 据我所知,Moq无法直接创建模拟实例。我想要一个替代方案来实现整个接口,它可能会更大,并且会发生变化,而我不想改变测试 我曾经发现一个非常复杂的ExportProvider代码,带有键值字符串,如果ExportFactory[t]的泛型类型本身是泛型的,那么它就不起作用 编辑: 事实证明,现有代码使用了从type.FullName生成的合同名称字符串。这对于非泛型很好,但泛型有不同的名称语法。我使用的代码已经有一个相当复杂的类,它派生自ExportProvider并重写了一些原始方法,这允许工厂返回Moq mock.Object实例。它实际上总是同一个实例,不是真正的工厂。另请参见关于CodeReview的问题:C# 如何模拟MEF出口工厂<;TGeneric>;使用Moq实例?,c#,.net,moq,mef,C#,.net,Moq,Mef,如何使用IMyType[T](本身就是一个通用接口)的模拟来模拟托管可扩展性框架(MEF)导入到ExportFactory[IMyType[T]]中?或者,一般来说,指定ExportFactory返回的实例,而这些实例不能单独使用构造函数创建 据我所知,Moq无法直接创建模拟实例。我想要一个替代方案来实现整个接口,它可能会更大,并且会发生变化,而我不想改变测试 我曾经发现一个非常复杂的ExportProvider代码,带有键值字符串,如果ExportFactory[t]的泛型类型本身是泛型的,那
//实际的泛型类型在这里没有意义,但它是一个泛型接口
公共接口IMyType
{
字符串GetMessage();
}
公共类FactoryImporter
{
[进口]
ExportFactory MyTypeFactory{get;set;}
}
公共类测试员
{
public void TestFactoryImporter()
{
Func createMockFunc=()=>
{
var mock=new mock();
Setup(m=>m.GetMessage()).Returns(“我是一个模拟的IMyType”);
返回mock.Object;
}
var regBuilder=new RegistrationBuilder();
//伪代码,在现实中如何做到这一点?
regBuilder.ForType().CreateInstance(createMockFunc);
var catalog=new AggregateCatalog();
var appCatalog=新应用程序目录(regBuilder);
catalog.Catalogs.Add(appCatalog);
var容器=新的合成容器(目录);
var factoryImporter=新的factoryImporter();
集装箱.复合件(factoryImporter);
断言你是平等的(
“我是一个被嘲笑的IMyType”,
factoryImporter.MyTypeFactory.GetExport().Value.GetMessage());
}
}
// actual generic type is meaningless here, but it is a generic interface
public interface IMyType<T>
{
string GetMessage();
}
public class FactoryImporter<T>
{
[Import]
ExportFactory<IMyType<T>> MyTypeFactory {get;set;}
}
public class Tester
{
public void TestFactoryImporter()
{
Func<IMyType<string>> createMockFunc = () =>
{
var mock = new Mock<IMyType<string>>();
mock.Setup(m => m.GetMessage()).Returns("I'm a mocked IMyType<string>");
return mock.Object;
}
var regBuilder = new RegistrationBuilder();
// pseudo-code, how to do this in reality?
regBuilder.ForType<IMyType<string>>().CreateInstance(createMockFunc);
var catalog = new AggregateCatalog();
var appCatalog = new ApplicationCatalog(regBuilder);
catalog.Catalogs.Add(appCatalog);
var container = new CompositionContainer(catalog);
var factoryImporter = new FactoryImporter<string>();
container.ComposeParts(factoryImporter);
Assert.AreEqual(
"I'm a mocked IMyType<string>",
factoryImporter.MyTypeFactory.GetExport().Value.GetMessage());
}
}