C# 我应该如何正确地测试IoC服务?

C# 我应该如何正确地测试IoC服务?,c#,dependency-injection,compact-framework,inversion-of-control,opennetcf,C#,Dependency Injection,Compact Framework,Inversion Of Control,Opennetcf,我必须测试在MyMobileApp.MyService.Module中实现的IoC服务 目前,我的单元测试项目MyMobileApp.MyService.Module.Tests引用了IoC模块MyMobileApp.MyService.Module CFTestRunner用于调试,VisualStudio TestRunner也可用于运行测试,并输出到GUI窗口(???) IMHO此体系结构有以下缺点: 必须在[TestInitialize]中手动初始化服务: 试试看 { var mod

我必须测试在MyMobileApp.MyService.Module中实现的IoC服务

目前,我的单元测试项目MyMobileApp.MyService.Module.Tests引用了IoC模块MyMobileApp.MyService.Module

CFTestRunner用于调试,VisualStudio TestRunner也可用于运行测试,并输出到GUI窗口(???)

IMHO此体系结构有以下缺点:

  • 必须在[TestInitialize]中手动初始化服务:
试试看
{
var module=new module();//缺点:如果应该使用两个服务怎么办?
module.AddServices();
}
catch(异常)//只能添加一次服务
{
//证明
//如果单元测试在CFTestRunner下运行,则不会执行ClassInitialize方法???
}

this.myService=RootWorkItem.Services.Get();

  • 为了测试另一个服务实现,我应该更改引用并重新编译测试项目
因此,我有一些改进意见:

  • 使用ProfileCatalog的可测试版本允许IoC容器自动添加测试服务,这样好吗?如何在devcie/emulator上正确部署此ProfileCatalog

  • 在测试类中使用注入服务好吗(如果可能的话)


另外,我在哪里可以找到具有良好测试模式的示例代码/项目/文章?我指的是测试IoC服务

通常我会为所有服务提供接口。这允许创建模拟服务并将其注入ServicesCollection。然后,我的测试项目通常会包含接口的几个实现,允许我使用适合给定测试的实现。然后在TestInitialize或TestClass构造函数中创建一个注入适当项的函数。您的模块应该通过接口拉取依赖项服务,这样它将在您需要时获取您的测试实例

如果您查看CFTestRunner的源代码,您会发现除了TestMethod和TestInitialize属性之外,我没有做很多辅助支持。如果你需要的话,你当然可以扩展它,但是它这么薄的原因是因为我从来都不需要其他东西


您无法真正测试直接模块加载,因为CFTestRunner不是
SmartClientApplication
,因此永远不会加载IModuleInfoStore。我想您可以创建一个派生的CFTestRunner,它是一个
SmartClientApplication
,这将允许您为TestClass创建一个属性,该属性将允许您返回
IModuleInfoStore

您是否研究过Moq?.NET CF之类的模拟框架。NET CF不支持反射。Emit生成代理所需的反射。您自己把它们去掉怎么样?您的问题似乎与将依赖项注入测试中的实际代码有关。。。您不应该在单元测试期间这样做,因为它们会导致您的测试需要很长时间才能执行。这更像是构建时的集成测试。