打字稿单元测试私有和受保护的方法

Esq*_*uth 5 mocha.js jasmine webstorm chai typescript

我希望能够测试私有Typescript方法。请跳过你的讲座why this is a bad idea。我听说过。

这是一个演示代码:

class MyClass {
    age: number

    private ageAsString(): string {
        return '15'
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是我在测试文件中的选项:

1 -//@ts-ignore允许 TS 编译此行的写入。当您调用 200 x expect()s时,这会很快变得不方便。但是我找不到基于文件的方法来执行此块。

it('Test ageAsString', () => {
    // @ts-ignore
    expect(new MyClass().ageAsString()).to.equal('15')
})
Run Code Online (Sandbox Code Playgroud)

2 - 将类对象转换为any对象。这会禁用我从 TS 和我的 IDE 获得的自动完成和重构功能。一开始这似乎是个好主意,但 1 个月后,它要么会破坏我的 200 个测试用例,要么会产生一些无法预料的错误。

it('Test ageAsString', () => {
    const anyClass: any = new MyClass
    expect(anyClass.ageAsString()).to.equal('15')
})
Run Code Online (Sandbox Code Playgroud)

3 - 可以使用数组访问,它可以工作,但会产生与 #2 相同的问题。

it('Test ageAsString', () => {
    expect(new MyClass()['ageAsString']()).to.equal('15')
})
Run Code Online (Sandbox Code Playgroud)

我想以某种方式能够测试这些方法而没有缺点。现在我有两个选择,都不好。

  1. 跳过编写特定的详细单元测试
  2. 公开方法

请给我第三个选项

小智 7

测试受保护方法的另一种方法是创建一个 Fake 类并扩展需要测试的类。

class MyClass {
  protected test() {
    return true;
  }
}
Run Code Online (Sandbox Code Playgroud)
class FakeMyClass extends MyClass {
  public test() {
    return super.test();
  }
}
Run Code Online (Sandbox Code Playgroud)
it('test', () => {
    const myClass = new FakeMyClass();
    expect(myClass.test()).to.true;
})
Run Code Online (Sandbox Code Playgroud)