单元测试私有方法

bsr*_*bsr 5 unit-testing angularjs typescript

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

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

    private addProp(){
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

Jef*_*ski 7

一种解决方案是重新构建代码,使其更易于测试.您可以创建一个AddPropProvider执行实际工作(实现详细信息,以便进行测试)并将其传递给构造函数MyCtrl.这是控制策略的经典倒置.

另一种解决方案可能就是将该功能公之于众?Private是隐藏可能改变的实现细节的理想选择,但也许你知道函数总是会在那里.

最后是黑客攻击.该函数确实存在于实例上,MyCtrl并且编译器只是不希望您调用它,因为您这样说.

var m = new MyCtrl();
(<any>m).addProp();
Run Code Online (Sandbox Code Playgroud)

现在,如果删除或修改该addProp代码的签名仍然会编译,那么您就失去了类型安全性.在大多数代码中都会很糟糕.但这是单元测试代码,因此我们将尽早及轻松地了解休息,因此它并不可怕.

  • 单元测试不是一成不变的.他们经常需要在实施变更时进行更改.避免这样做是编写功能测试. (2认同)