【问题标题】:How should I test IoC services properly?我应该如何正确测试 IoC 服务?
【发布时间】:2014-02-28 12:07:12
【问题描述】:

我必须测试在 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 服务

【问题讨论】:

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

标签: c# dependency-injection compact-framework inversion-of-control opennetcf


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多