【问题标题】:Typescript unit test private and protected methods打字稿单元测试私有和受保护方法
【发布时间】: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')
})

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

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

请给我第三个选项

【问题讨论】:

  • 如果你真的很想这么称呼它,那就公开吧。否则,只需使用调用此私有方法的另一个 MyClass 方法并确保它返回正确的结果。
  • 但我同意,如果您实际上是在测试所有公共方法,那么测试您的私有方法是非常不必要的。
  • 测试较小的私有函数比测试较大的公共函数更容易且更具可读性
  • 如果你的类有那么大,那么你的可测试私有方法可能应该是其他一些服务的公共功能,它只承担这个责任。
  • 显然它并不容易和简单,因此为什么这个问题没有其他答案。 :D

标签: typescript jasmine mocha.js webstorm chai


【解决方案1】:

另一种测试受保护方法的方法是创建一个 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;
})

【讨论】:

    猜你喜欢
    • 2015-02-26
    • 2011-07-09
    • 1970-01-01
    • 2011-08-01
    • 2022-09-23
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 2013-10-10
    相关资源
    最近更新 更多