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

arn*_*old 17 unit-testing jasmine angularjs

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

例:

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

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

我该怎么做?

提前致谢.

小智 14

谢谢jabko87。

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

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

注意:这里 service 是 Class,transformNative 是私有方法,{name: 'PR'} 传递一个对象参数


ach*_*han 10

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

通过测试doOfferCal(),你隐含地测试了myPrivate()做正确的事情.

虽然这是针对RailsConf的,但Sandi Metz在应该测试什么方面有很好的讨论.

  • 一种思想是私有方法是实现细节.通过测试您的私有方法,即使您的公共方法仍然正常运行,您的测试也会中断.因此,您最终可能会创建过于脆弱的测试,并且会吓跑开发人员改进/重构实现. (3认同)
  • 此外,这将使您可以自由地优化`doOfferCal()`的实现,而不会破坏任何单元测试. (3认同)
  • 对不起,我没有意识到按回车将提交我的帖子..在这种情况下我会做的是测试`doOfferCal()`然后验证它返回的复杂对象.如果该测试通过,则其间的所有私有方法都按预期工作.我相信你会找到支持私有方法的人,但是我发现这对于编写有用和可维护的单元测试最有用. (2认同)

mic*_*czy 7

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

var myPrivateSpy = spyOn(productDisplayService, "myPrivate").and.callThrough();
myPrivateSpy.call();
Run Code Online (Sandbox Code Playgroud)


Rob*_*Tab 6

如果你想调用你的私有方法,你只需这样做:

component["thePrivateMethodName"](parameters);
Run Code Online (Sandbox Code Playgroud)

component您的服务类别或组件类别在哪里。


MBi*_*ski 2

为了测试内部函数,我调用外部函数来调用内部函数,然后根据内部函数的需要改变我的输入。因此,在您的情况下,您将productDisplay根据myPrivate需要调用并改变您的输入,然后验证您是否具有预期的输出。您还可以使用或myPrivate来监视和测试事物。.havebeencalledwith.andcallthrough