2

我必须测试在 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 如何正确部署在设备/模拟器上?

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

我在哪里可以找到具有良好测试模式的示例代码/项目/文章 - 我的意思是测试 IoC 服务

4

1 回答 1

1

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

如果您查看 CFTestRunner 的源代码,您会发现除了 TestMethod 和 TestInitialize 属性之外,我没有做很多辅助支持。如果需要,您当然可以扩展它,但它如此薄的原因是因为我实际上从未需要其他任何东西。

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

于 2014-02-28T14:58:19.680 回答