我必须测试在MyMobileApp.MyService.Module中实现的IoC服务。
目前,我的单元测试项目MyMobileApp.MyService.Module.Tests已在IoC模块MyMobileApp.MyService.Module上引用
CFTestRunner用于调试,Visual Studio测试运行器也可以用于运行测试,并将输出输出到GUI窗口(???)
恕我直言,这种架构有缺点:
必须在[TestInitialize]中手动初始化服务:try{ var module = new Module(); // Drawback: what if 2 services should be used? module.AddServices();}catch (Exception) // Services must be added only once{// In TestInitialize// ClassInitilaize method is not executed if unit test is running under CFTestRunner???}
this.myService = RootWorkItem.Services.Get();
为了测试另一个服务实现,我应该更改引用并重新编译测试项目
因此,我有一些改进的想法:
使用ProfileCatalog的可测试版本允许IoC容器自动添加测试服务是否很好?如何将ProfileCatalog正确部署在devcie / emulator上?
在测试类中使用注入服务是否可行(如果可能)?
此外,在哪里可以找到具有良好测试模式的示例代码/项目/文章-我的意思是测试IoC服务
最佳答案
通常,我会连接所有服务。这允许将模拟服务创建和注入到ServicesCollection中。这样,我的Test项目通常将包含接口的几种实现,使我可以使用适合给定测试的任何一种。然后,您可以在TestInitialize或TestClass构造函数中创建一个注入适当的项目。您的模块应按接口提取依赖项服务,以便在需要时获取测试实例。
如果您查看CFTestRunner的源代码,您会发现我在TestMethod和TestInitialize属性之外并没有提供很多辅助支持。当然可以根据需要扩展它,但是它如此之细的原因是因为我实际上从不需要任何其他东西。
您无法真正测试直接模块的加载,因为CFTestRunner不是SmartClientApplication
,因此IModuleInfoStore永远不会加载。我想您可以创建一个派生的CFTestRunner,它是一个SmartClientApplication
,它将允许您为TestClass创建一个属性,该属性可以让您返回IModuleInfoStore
。
关于c# - 如何正确测试IoC服务?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22094783/