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

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个选择,都不好。

  1. 跳过编写具体的详细单元测试
  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;
})