2013-07-26 107 views
12

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

例子:

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

使用茉莉它简单的代码测试“doOfferCal”,但我想要写myPrivate单元测试过。

我该怎么办?

在此先感谢。

+0

的可能重复[我怎样测试一个具有私有方法,字段或内部类的类?](https://stackoverflow.com/questions/34571/how-do-i-test-a-class-that-has-private-methods-fields-or -inner-classes) – Raedwald

回答

0

为了测试内部函数,我调用外部函数调用内部函数,然后根据内部函数的要求改变我的输入。所以,在你的情况下,你可以调用'productDisplay'并根据'myPrivate'需要改变你的输入,然后验证你是否有预期的输出。你也可以窥探'myPrivate'并用这种方式来测试事情,使用.havebeencalledwith或.andCallthrough。

8

是否有你想测试你的私有方法的具体原因?

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

虽然这是用于RailsConf,但Sandi Metz在what should be tested上有很好的演讲。

+0

我的“doOfferCal”调用了许多私有方法,并最终返回一个复杂的结果,因为为什么认为测试每个私有方法会很好。顺便问一下,在这种情况下你有什么建议吗? – arnold

+2

一派思想是私有方法是实现细节。通过测试你的私有方法,即使你的公共方法仍然正常工作,你的测试也会中断。因此,您最终可能会创建太脆弱的测试,从而吓退开发人员无法改进/重构实现。 – achan

+2

对不起,我没有意识到按Enter键会提交我的帖子..在这种情况下我会做的是测试'doOfferCal()',然后验证它返回的复杂对象。如果该测试通过,则两者之间的所有私有方法都按预期工作。我相信你会发现有人支持私有方法,但这是我发现的最适合我的编写有用和可维护的单元测试的方法。 – achan

2

亚干是100%正确的,但如果你真的需要打电话给你测试的私有方法(应该是什么永远:-))你可以做到这一点:

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