单元测试私有方法

时间:2014-05-02 19:43:34

标签: angularjs unit-testing typescript

在打字稿中,测试私有方法的最佳方法是什么。在Angularjs中测试控制器时,有时控制器会向$ scope添加一个属性(函数),如果我不公开该属性,那么分配给$ scope,我可以测试它。是否有推荐的方式。

export class MyCtrl{
    constructor($scope){
        $scope.addProp = (d:string) => {
            this.addProp();
        }
    }

    private addProp(){
        //...
    }
}

3 个答案:

答案 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”开头,因此任何看到它的人都会认识到它不应该用在生产代码中。