问题是,如果对象足够复杂(在任何强类型语言中都是如此),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 许可协议
我在 TypeScript 中进行单元测试的经验明确表明,保留所有模拟对象的类型是值得的。当您使用
any
类型保留模拟时,重命名期间会出现问题。 IDE 无法正确发现应更改user
或settings
参数的哪些出现。当然,用一个完整的接口手动编写mock对象确实很费力。幸运的是,TypeScript 有两个工具可以创建类型安全的模拟对象: ts-mockito (受 Java mockito 启发)和 typemoq (受 C# Moq 启发)。