【问题标题】:Angular testing private methods [duplicate]角度测试私有方法[重复]
【发布时间】:2019-07-13 23:19:37
【问题描述】:

我已经构建了一个队列管理器,它与 RxJs 可观察对象一起工作并一个一个地执行它们。现在我想测试一下,但是我想测试的所有方法都是私有的。

Public 接口只有两个方法可以创建 observable 并将其添加到队列管理器中。

如果我尝试制作类似spyOn(myService, 'privateMethod') PhpStorm 的东西,分析表明它不能分配给类型(并且指的是公共方法)。

我无法将其提取到会公开的内容中,因为这是一个复杂的逻辑,不应从外部中断。

【问题讨论】:

  • 坦率地说@trichetriche,您声称是重复的链接从测试的意义上回答了这个问题。但是,如果 OP 想要在他们身上添加一个间谍,它不会显示如何。
  • @NormundsKalnberzins 我已取消删除我的答案,以便他可以看到它,应该足够了。
  • @NormundsKalnberzins 顺便说一句,副本确实解释了如何访问类的私有成员。

标签: angular typescript unit-testing testing jasmine


【解决方案1】:

您可以使用spyOn<any>(myService, 'privateMethod') 绕过它。

但是,如果您的方法是私有的,则它们不应该被测试,它们应该是实现细节。相反,您应该测试公共函数的最终结果。

【讨论】:

  • 这是真的,“不应该被测试”。我认为这是一种罪过,但我使用了私有方法的间谍(就像你描述的那样)来模拟一个状态(比如使用返回值)或验证是否已经采取了某些操作,而无需创建任何更复杂的环境这些私有方法可能会与之互动。
  • @NormundsKalnberzins 而不是模拟私有方法,您应该模拟提供者(HttpClient 大多数时候)并保留您的私有方法。我在这里谈论最佳实践,我不是强迫你这样做,你做你想做的事。我只是告诉你一个干净且易于维护的代码是什么样的。
  • 对 HttpClient 的请求很容易,因为我们有 HttpTestController。否则,模拟私有方法使用的外部依赖或监视私有方法以覆盖是语法问题/看起来不是实质
  • @NormundsKalnberzins 这是一个实质问题。模拟这些方法意味着只要稍有改变,您就必须删除您的间谍。模拟依赖意味着如果发生最轻微的更改,您只需编辑依赖项,并且更改将在整个测试中重新执行。同样,我不是在告诉你如何编码,我只是在解释最佳实践。它们是最佳实践是有原因的,无论你的论点如何,你都不能反对它们。
  • 问题是我的私有方法不能公开并且是相互关联的。
猜你喜欢
  • 2019-01-23
  • 2018-01-15
  • 1970-01-01
  • 2015-03-14
  • 2019-10-07
  • 2016-11-25
  • 1970-01-01
  • 2018-06-27
  • 2014-08-10
相关资源
最近更新 更多