在打字稿中,测试私有方法的最佳方法是什么。在Angularjs中测试控制器时,有时控制器会向$ scope添加一个属性(函数),如果我不公开该属性,那么分配给$ scope,我可以测试它。是否有推荐的方式。
export class MyCtrl{
constructor($scope){
$scope.addProp = (d:string) => {
this.addProp();
}
}
private addProp(){
//...
}
}
答案 0 :(得分:7)
一种解决方案是重新架构您的代码,使其更易于测试。您可以创建一个AddPropProvider
来完成实际工作(实现细节更多地暴露在测试中)并将其传递给MyCtrl
的构造函数。这是控制策略的经典倒置。
另一种解决方案可能就是将该功能公之于众? Private非常适合隐藏可能会发生变化的实现细节,但也许您知道函数总是会出现在那里。
最后还有黑客攻击。该函数确实存在于MyCtrl
的实例上,并且编译器只是不希望您调用它,因为您这样说。
var m = new MyCtrl();
(<any>m).addProp();
现在,如果删除或修改addProp
的签名,代码仍会编译,那么您就失去了类型安全性。在大多数代码中都会很糟糕。但这是单元测试代码,因此我们可以提前及轻松地了解休息时间,因此它并不可怕。
答案 1 :(得分:1)
一种解决方案是不将范围用作ui的强粘合剂,仅将其用作控制器类实例的容器。这也具有其他优点http://www.youtube.com/watch?v=WdtVn_8K17E
然后你就可以像测试任何其他JavaScript类一样测试你的控制器,而不用担心你的测试中的$ scope。
答案 2 :(得分:1)
虽然我同意上面提出的Jeffery Grajkowski的解决方案,但您还应该考虑另外一个选项。由于JavaScript(以及扩展名为TypeScript)没有“真正的”私有类型,因此将其公开,但按惯例设为私有。
也就是说,方法名称以下划线或“unitTest”开头,因此任何看到它的人都会认识到它不应该用在生产代码中。