我正在使用 MEF 将我的对象组合在一起,并且在测试一些未导出到 MEF 容器但依赖于 MEF 将对象实例注入属性设置器的类时遇到了问题。
例如考虑以下两个视图模型
public class ViewModelA
{
[Import]
internal IAdmin AdminService
{
get;
private set;
}
public ViewModelA()
{
CompositionInitializer.SatisfyImports(this);
}
//constructor for testing
internal ViewModelA(IAdmin adminService)
{
this.AdminService = adminService;
}
public void DoSomething()
{
this.AdminService.SetCurrentWindow(new ViewModelB());
}
}
public class ViewModelB
{
[Import]
internal IAdmin AdminService
{
get;
private set;
}
[Import]
internal IAnotherService AnotherServiceService
{
get;
private set;
}
public ViewModelB()
{
CompositionInitializer.SatisfyImports(this);
}
public void DoAnotherThing()
{
//Does something with the properties injected via MEF
}
}
这些类不会导出到 MEF 容器,因此我依靠调用CompositionInitializer.SatisfyImports(this)
来强制导入依赖项。
我想为 ViewModelA 创建一个测试,检查对 DoSomething 的调用导致该IAdmin.SetCurrentWindow
方法被 ViewModelB 的实例调用一次。为了满足这一点,我为 ViewModelA 创建了一个以 IAdmin 作为参数的构造函数重载,我还利用 Moq 和 Silverlight 单元测试框架创建了以下测试。
[TestMethod]
public void DoSomethingStandard_CallsSetCurrentWindowWithViewModelB()
{
var adminServiceMock = new Mock<IAdmin>();
var vmA = new ViewModelA(adminServiceMock.Object);
vmA.DoSomething();
adminServiceMock.Verify(ad => ad.SetCurrentWindow(It.IsAny<ViewModelB>()), Times.Exactly((1)));
}
我的问题是,当测试运行调用以ViewModelA.DoSomething
实例化 ViewModelB 时,它又会抛出一个
System.Reflection.ReflectionTypeLoadException:无法加载一种或多种请求的类型。检索 LoaderExceptions 属性以获取更多信息。
这是因为 ViewModelB 构造函数调用CompositionInitializer.SatisfyImports(this)
但在我的测试项目中没有设置 MEF 容器。
关于如何最好地测试这种情况有什么想法吗?或者如何重组代码以使其可测试?