在 Typescript 单元测试中模拟

新手上路,请多包涵

问题是,如果对象足够复杂(在任何强类型语言中都是如此),Typescript 中的模拟可能会变得棘手。你通常会模拟一些额外的东西只是为了编译代码,例如在 C# 中,你可以使用 AutoFixture 或类似的东西。另一方面,Javascript 是动态语言,可以只模拟测试运行所需的对象的一部分。

因此,在 Typescript 单元测试中,我可以使用 any 类型声明我的依赖关系,从而轻松模拟它。您看到这种方法有什么缺点吗?

 let userServiceMock: MyApp.Services.UserService = {
    // lots of thing to mock
}

对比

let userServiceMock: any = {
    user: {
         setting: {
             showAvatar: true
         }
    }
}

原文由 Andriy Horen 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 352
2 个回答

我在 TypeScript 中进行单元测试的经验明确表明,保留所有模拟对象的类型是值得的。当您使用 any 类型保留模拟时,重命名期间会出现问题。 IDE 无法正确发现应更改 usersettings 参数的哪些出现。当然,用一个完整的接口手动编写mock对象确实很费力。

幸运的是,TypeScript 有两个工具可以创建类型安全的模拟对象: ts-mockito (受 Java mockito 启发)和 typemoq (受 C# Moq 启发)。

原文由 Terite 发布,翻译遵循 CC BY-SA 4.0 许可协议

现在 TypeScript 3 出来了,完整的强类型终于可以表达了!我利用了这一点并将 NSubstitute 移植到 TypeScript。

它可以在这里找到: https ://www.npmjs.com/package/@fluffy-spoon/substitute

我在这里与最流行的框架进行了比较: https ://medium.com/@mathiaslykkegaardlorenzen/with-typescript-3-and-substitute-js-you-are-already-missing-out-when-mocking-or-faking -a3b3240c4607

请注意它是如何从接口中创建伪造的,并在此过程中具有完整的强类型!

原文由 Mathias Lykkegaard Lorenzen 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题