打字稿单元测试私有和受保护的方法
Typescript unit test private and protected methods
我希望能够测试私有 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 - 将 class 对象变成 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')
})
我想以某种方式能够在没有缺点的情况下测试这些方法。现在我有2个选择,都不好。
- 跳过编写具体的详细单元测试
- 制作方法public
请给我第三个选择
另一种测试受保护方法的方法是创建一个假 class 并扩展需要测试的 class。
class MyClass {
protected test() {
return true;
}
}
class FakeMyClass extends MyClass {
public test() {
return super.test();
}
}
it('test', () => {
const myClass = new FakeMyClass();
expect(myClass.test()).to.true;
})
我希望能够测试私有 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 - 将 class 对象变成 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')
})
我想以某种方式能够在没有缺点的情况下测试这些方法。现在我有2个选择,都不好。
- 跳过编写具体的详细单元测试
- 制作方法public
请给我第三个选择
另一种测试受保护方法的方法是创建一个假 class 并扩展需要测试的 class。
class MyClass {
protected test() {
return true;
}
}
class FakeMyClass extends MyClass {
public test() {
return super.test();
}
}
it('test', () => {
const myClass = new FakeMyClass();
expect(myClass.test()).to.true;
})