我正在使用 MEF 进行依赖注入,我正在编写一个单元测试,其中我必须注入一个模拟依赖项,但我已将其声明为{{1这让我无法做到。
使用{ get; protected set; }
属性导入依赖项,这意味着它不会通过构造函数或类似的东西传递。
什么是正确的方法,并且“正确”我的意思是它不违反像SOLID和类似的任何原则来解决这个不方便的问题?
代码:
[Import]
答案 0 :(得分:1)
除非密封了类,否则可以创建一个继承自它的类并设置受保护的属性:
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);
另一种选择 - 如果被测试的类被密封则必须使用 - 是使用PrivateObject来设置属性,或者只是使用普通的旧反射来实现它。