Typescript单元测试专用和受保护的方法

时间:2019-02-23 20:42:11

标签: typescript jasmine mocha webstorm chai

我希望能够测试专用的Typescript方法。请跳过您的why this is a bad idea讲座。我听到了

这是演示代码:

class MyClass {
    age: number

    private ageAsString(): string {
        return '15'
    }
}

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

1-编写//@ts-ignore,允许TS编译此行。当您拨打200 x expect()时,这会非常不便。但是我找不到一种基于文件的基于块的方法。

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')
})

我希望能够以某种方式测试这些方法而不会带来不利影响。现在我有2个选择,都不好。

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

请给我第三个选择

1 个答案:

答案 0 :(得分:4)

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

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;
})