C# - 分配从 MEF 导入的模拟依赖项

C# - Assign Mocked dependencies that are Imported from MEF

我正在使用 MEF 进行依赖项注入,此时我正在编写一个单元测试,我必须在其中注入一个模拟的依赖项,但我已经声明它是 { get; protected set; },这让我无法做到。

依赖项是使用 [Import] 属性导入的,这意味着它不是通过构造函数或类似的东西传递的。

什么是正确的方法,"right"我的意思是它不违反任何像 SOLID 和类似的原则,来解决这个不方便?

代码:

[Import]  // MEF is able to inject it even tho it's set accessor is protected
IMyDependencie MyDependency { get; protected set; }

除非 class 是密封的,你可以创建一个 class 从它继承并设置受保护的 属性:

public class TestClass : ClassToBeTested
{
    public TestClass(IMyDependencie mockDependency)
    {
        // Set protected property:
        MyDependency = mockDependency;
    }
}

然后在单元测试的设置中,创建具有模拟依赖项的对象:

 // These will be fields in the test class.
 Mock<IMyDependencie> mockDependency = new Mock<IMyDependencie>();

 TestClass tc = new TestClass(mockDependency.Object);

另一种方法 - 如果被测 class 被密封,你将不得不使用 - 是使用 PrivateObject 来设置 属性,或者只是简单的旧反射去做。