Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何模拟MEF出口工厂<;TGeneric>;使用Moq实例?_C#_.net_Moq_Mef - Fatal编程技术网

C# 如何模拟MEF出口工厂<;TGeneric>;使用Moq实例?

C# 如何模拟MEF出口工厂<;TGeneric>;使用Moq实例?,c#,.net,moq,mef,C#,.net,Moq,Mef,如何使用IMyType[T](本身就是一个通用接口)的模拟来模拟托管可扩展性框架(MEF)导入到ExportFactory[IMyType[T]]中?或者,一般来说,指定ExportFactory返回的实例,而这些实例不能单独使用构造函数创建 据我所知,Moq无法直接创建模拟实例。我想要一个替代方案来实现整个接口,它可能会更大,并且会发生变化,而我不想改变测试 我曾经发现一个非常复杂的ExportProvider代码,带有键值字符串,如果ExportFactory[t]的泛型类型本身是泛型的,那

如何使用IMyType[T](本身就是一个通用接口)的模拟来模拟托管可扩展性框架(MEF)导入到ExportFactory[IMyType[T]]中?或者,一般来说,指定ExportFactory返回的实例,而这些实例不能单独使用构造函数创建

据我所知,Moq无法直接创建模拟实例。我想要一个替代方案来实现整个接口,它可能会更大,并且会发生变化,而我不想改变测试

我曾经发现一个非常复杂的ExportProvider代码,带有键值字符串,如果ExportFactory[t]的泛型类型本身是泛型的,那么它就不起作用

编辑: 事实证明,现有代码使用了从type.FullName生成的合同名称字符串。这对于非泛型很好,但泛型有不同的名称语法。我使用的代码已经有一个相当复杂的类,它派生自ExportProvider并重写了一些原始方法,这允许工厂返回Moq mock.Object实例。它实际上总是同一个实例,不是真正的工厂。另请参见关于CodeReview的问题:

//实际的泛型类型在这里没有意义,但它是一个泛型接口
公共接口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());
    }
}