私有方法使用Jasmine进行单元测试

时间:2013-07-26 15:43:11

标签: unit-testing angularjs jasmine

我正在使用茉莉花为角应用编写测试用例。但是许多内部方法在服务中被声明为私有。

示例:

App.service('productDisplay', function(){
    var myPrivate = function(){
        //do sth
    }
    this.doOfferCal = function(product, date){
        //call myPrivate
        //do sth too
        return offer;
    }
});

使用jasmine可以直接编写“doOfferCal”的代码测试,但我也想为myPrivate编写单元测试。

我该怎么做?

提前致谢。

5 个答案:

答案 0 :(得分:9)

您是否有特定原因要测试私人方法?

通过测试doOfferCal(),您隐式测试myPrivate()正在做正确的事情。

虽然这是针对RailsConf的,但是Sandi Metz在what should be tested上有很好的谈话。

答案 1 :(得分:5)

Achan是100%正确的,但是如果你真的需要在你的测试中调用私有方法(应该永远不会:-))你可以通过以下方式来实现:

var myPrivateSpy = spyOn(productDisplayService, "myPrivate").and.callThrough();
myPrivateSpy.call();

答案 2 :(得分:2)

为了测试内部函数,我调用调用内部函数的外部函数,然后根据内部函数的要求改变输入。因此,在您的情况下,您可以调用productDisplay并根据myPrivate需要更改输入,然后验证您是否具有预期输出。你也可以窥探myPrivate,并使用.havebeencalledwith.andcallthrough对此进行测试。

答案 3 :(得分:2)

感谢jabko87。

此外,如果要传递参数,请使用以下示例:

const myPrivateSpy = spyOn<any>(service, 'transformNative').and.callThrough();
 myPrivateSpy.call(service, {name: 'PR'});

注意:这里的服务是类,transformNative是私有方法,{name:'PR'}传递对象参数

答案 4 :(得分:0)

如果要调用私有方法,则只需要这样做:

component["thePrivateMethodName"](parameters);

component是您的服务类或组件类。