【发布时间】:2016-06-29 11:06:28
【问题描述】:
如何在 Angular 2 中测试私有函数?
class FooBar {
private _status: number;
constructor( private foo : Bar ) {
this.initFooBar();
}
private initFooBar(){
this.foo.bar( "data" );
this._status = this.fooo.foo();
}
public get status(){
return this._status;
}
}
我找到的解决方案
-
将测试代码本身放在闭包内或在闭包内添加代码,该闭包存储对外部范围内现有对象的局部变量的引用。
稍后使用工具剥离测试代码。 http://philipwalton.com/articles/how-to-unit-test-private-functions-in-javascript/
如果你有做过的话,请给我一个更好的方法来解决这个问题?
附言
大多数类似问题的答案都没有解决问题,这就是我问这个问题的原因
大部分开发者都说你不测试私有函数,但我没有说它们是对是错,但我的情况有必要测试私有函数。
【问题讨论】:
-
我喜欢一半的答案实际上应该是 cmets。 OP问问题,你怎么X?接受的答案实际上告诉你如何做 X。然后大多数人转身说,我不仅不会告诉你 X(这显然是可能的),而且你应该做 Y。大多数单元测试工具(我不是这里只讨论 JavaScript)能够测试私有函数/方法。我将继续解释原因,因为它似乎在 JS 领域迷失了(显然,给出了一半的答案)。
-
将问题分解为可管理的任务是一种很好的编程习惯,因此函数“foo(x:type)”将调用私有函数 a(x:type), b(x:type), c (y:another_type) 和 d(z:yet_another_type)。现在因为 foo, 正在管理调用并将东西放在一起,它会产生一种湍流,就像溪流中岩石的背面,很难确保所有范围都经过测试的阴影。因此,更容易确保每个子范围的有效,如果您尝试单独测试父“foo”,则范围测试在某些情况下会变得非常复杂。
-
这并不是说你不测试公共接口,显然你这样做了,但是测试私有方法允许你测试一系列短的可管理块(与你编写它们的原因相同首先,为什么在测试时要撤消此操作),并且仅仅因为公共接口上的测试是有效的(可能调用函数限制了输入范围)并不意味着私有方法在添加时没有缺陷更高级的逻辑并从其他新的父函数中调用它们,
-
如果你用 TDD 正确地测试了它们,你就不会试图弄清楚你后来在做什么,当你应该正确地测试它们时。
-
@Quaternion 这条关于 TDD 的评论围绕着 OP 的问题,实际上并没有为测试私有方法的总体思路提供任何有价值的见解。有时您确实需要访问私有成员才能获得良好的测试覆盖率,这就是 Spring Boot 测试包具有反射工具的原因。即使公共方法正在访问这些私有成员,也很有可能无法覆盖边缘情况,除非您可以在单元测试中直接调用私有方法。
标签: angular unit-testing typescript jasmine