【问题标题】:Testing of private methods in typescript在打字稿中测试私有方法
【发布时间】:2020-06-06 08:30:25
【问题描述】:

假设我有以下打字稿类:

class MyComponent {
  private something: number;

  constructor () {
    this.something = 0
    this.incrementSomething()
  }

  private incrementSomething () : number {
    return this.something++
  }
}

export default MyComponent

我的目标是使用jest 对其进行测试,但我的问题比答案更多。

  • 这是一种糟糕的设计模式吗?
  • 是否应该测试私有方法? (网上众说纷纭,难以抉择)
  • 我是否应该在此设置中忽略 jest coverage,因为它会将类报告为未经测试?
  • 我应该创建一个公共方法并在其中调用我的私有方法吗?

这是我第一次尝试在typescript 中使用private 方法并尝试对其进行测试,所以请耐心等待:)

【问题讨论】:

  • 只支持“公开”测试的意见:您的班级暴露了“行为”,被“外部”称为,而这些才是最重要的。如果你认为私有方法中的一个逻辑在你的待测软件中足够复杂和重要,你不应该在类中公开它(如果它没有在外面使用,那就没有意义了),而是将这个逻辑提取到另一个类(静态助手类或服务等),其中方法是公共的。
  • 每个人都有意见,这就是为什么这个问题会积累。我的是 private 不应该被使用。
  • @Morpheus :您的示例对于演示目的非常简单。那么我们来分析一下它的行为。似乎发生的事情是有一个字段something,并且在构造后它的值为1。所以测试一下,new MyComponent() 给出了一个带有something === 1 的对象。它使用方法“incrementSomething”这一事实是对这种行为并不重要的实现细节。如果“增量逻辑”用在很多地方,那么它应该是其他类中的公共方法,就像我在之前的评论中所说的那样。
  • 我同意@AluanHaddad,但我认为争论的双方都有自己的优势;我认为两者都不是严格正确的。我认为这个问题应该更新为only 涵盖how 来测试私有方法;任何事情都可能只是意见
  • @Morpheus 我明白了,我个人建议您确实应该测试私有方法,我只是认为这样的问题是错误的地方;它是基于意见的,可能更像software engineering stack exchange.

标签: javascript typescript jestjs test-coverage


【解决方案1】:

我认为 SO 不是此类问题的理想场所,因为您所问的大部分内容都是基于意见的。但是,您可以断言该对象是 any 以便进行一些测试:

class MyComponent {
  private something: number;

  constructor () {
    this.something = 0
    this.incrementSomething()
  }

  private incrementSomething () : number {
    return this.something++
  }
}

const thingIWantToTest = new MyComponent();

console.log((thingIWantToTest as any).something); // works
console.log(thingIWantToTest.something);          // type error

【讨论】:

  • 在测试中尝试此操作时出现 TS2349TS2448 编译错误。
  • @Morpheus 它的工作原理与描述的完全一样:typescriptlang.org/play/…
  • @morpheus 听起来您正在尝试调用该类的方法?
  • 是的,我的错 :) 我将根据您在问题和此解决方案下给出的 cmets 接受您的答案。非常感谢:)
  • 还有thingIWantToTest['something']
猜你喜欢
  • 1970-01-01
  • 2019-01-12
  • 1970-01-01
  • 2019-09-26
  • 2017-02-10
  • 1970-01-01
  • 1970-01-01
  • 2019-02-01
  • 2020-11-08
相关资源
最近更新 更多