【发布时间】:2019-02-23 20:42:11
【问题描述】:
我希望能够测试私有 Typescript 方法。请跳过why this is a bad idea的讲座。我听说过。
这是一个演示代码:
class MyClass {
age: number
private ageAsString(): string {
return '15'
}
}
这是我在测试文件中的选项:
1 - 写//@ts-ignore 允许TS 编译这一行。当您拨打 200 x expect()s 时,这会很快变得不方便。但是我找不到基于文件的方法来执行此块。
it('Test ageAsString', () => {
// @ts-ignore
expect(new MyClass().ageAsString()).to.equal('15')
})
2 - 将类对象转换为 any 对象。这会禁用我从 TS 和我的 IDE 获得的自动完成和重构功能。一开始这似乎是个好主意,但 1 个月后,它要么会破坏我的 200 个测试用例,要么会产生一些无法预料的错误。
it('Test ageAsString', () => {
const anyClass: any = new MyClass
expect(anyClass.ageAsString()).to.equal('15')
})
3 - 可以使用数组访问,这有效,但会产生与 #2 相同的问题。
it('Test ageAsString', () => {
expect(new MyClass()['ageAsString']()).to.equal('15')
})
我希望能够以某种方式测试这些方法而没有缺点。现在我有两个选择,都不好。
- 跳过编写具体的详细单元测试
- 公开方法
请给我第三个选项
【问题讨论】:
-
如果你真的很想这么称呼它,那就公开吧。否则,只需使用调用此私有方法的另一个 MyClass 方法并确保它返回正确的结果。
-
但我同意,如果您实际上是在测试所有公共方法,那么测试您的私有方法是非常不必要的。
-
测试较小的私有函数比测试较大的公共函数更容易且更具可读性
-
如果你的类有那么大,那么你的可测试私有方法可能应该是其他一些服务的公共功能,它只承担这个责任。
-
显然它并不容易和简单,因此为什么这个问题没有其他答案。 :D
标签: typescript jasmine mocha.js webstorm chai