25

我正在使用 jasmine 为 Angular 应用程序编写测试用例。但是许多内部方法在服务中被声明为私有。

例子:

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

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

我该怎么做?

提前致谢。

4

5 回答 5

16

谢谢jabko87。

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

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

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

于 2019-08-16T17:32:02.483 回答
10

您是否有特定原因希望测试您的私有方法?

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

尽管这是针对 RailsConf,但 Sandi Metz 对应该测试的内容进行了很好的讨论。

于 2013-07-26T16:03:46.340 回答
10

Achan 是 100% 正确的,但是如果您真的需要在测试中调用私有方法(永远不应该这样做:-)),您可以通过以下方式进行:

var myPrivateSpy = spyOn(productDisplayService, "myPrivate").and.callThrough();
myPrivateSpy.call();
于 2016-07-01T12:02:43.187 回答
3

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

component["thePrivateMethodName"](parameters);

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

于 2020-09-30T09:52:19.940 回答
2

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

于 2013-07-26T16:00:37.120 回答