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 来设置 属性,或者只是简单的旧反射去做。
我正在使用 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 来设置 属性,或者只是简单的旧反射去做。