Javascript Jasmine测试专用回调函数
我知道在unitTests中直接调用私有函数不是一个好的实践,我们必须通过公共方法测试私有代码 我的情况是,我不知道该怎么做才能实现我想要的。我想知道是否从我的间隔调用了回调函数。这是在角度控制器中实现的Javascript Jasmine测试专用回调函数,javascript,angularjs,jasmine,Javascript,Angularjs,Jasmine,我知道在unitTests中直接调用私有函数不是一个好的实践,我们必须通过公共方法测试私有代码 我的情况是,我不知道该怎么做才能实现我想要的。我想知道是否从我的间隔调用了回调函数。这是在角度控制器中实现的 function prepareInterval() { self.callbacksData = []; if(self.DynamicValuesList !== null) { self.myPromise = $interval(callbackFunction, us
function prepareInterval() {
self.callbacksData = [];
if(self.DynamicValuesList !== null) {
self.myPromise = $interval(callbackFunction, userInputInterval * 1000);
}
}
我的回调函数只显示callback函数中的数据。我想对callback函数进行单元测试,但是我不能
我试过了
我得到的错误是
callbackFunction()方法不存在
编辑:顺便说一句,我在beforeach函数中注入了角度模拟我在这里会采取稍微不同的方法 显然,您不希望
callbackFunction
本身被公开,所以不要这样做。保密
但是,您可以将其作为值返回给self
实例
self.myPromise = $interval(callbackFunction, userInputInterval * 1000);
所以你cán测试的是self.myPromise
值。如果该值包含间隔,则已设置了间隔,因此可以非常确定已调用方法
我希望self
对象是控制器,所以您可以像这样测试self.myPromise
的值:
it('myUnitTest', function(){
//Prepare data
var controller = createController();
expect(controller.myPromise).toBe( /* undefined? */);
});
更新 只需测试间隔值>0: 您可以尝试重构以实现可测试性。不过,我不确定stringmatcher是否能处理数字,我自己现在也没有时间进行测试:)
那么是Callback函数是私有的吗?@Randy完全正确。该callbackFunction未在我的self对象中定义,因为结果未公开。我想检查这个私有函数是否被调用。好的,你的答案是我在其他情况下应用的,它是正确的。也许我必须改变我的问题,因为如果你检查我的间隔取决于一个用户输入参数。我想检查userInputInterval是否小于0或为空,我仍然每隔1000毫秒调用一次我的间隔。原因是我想检查我的回调函数是否在调用之后被调用,我增加了我作为旁注附加的链接中的票证,如果
userInputInterval
为<1,它不会以这种方式每秒调用您的方法。如果您至少需要一秒钟,请尝试以下操作:userInputInterval&&userInputInterval>1?userInputInterval*1000:1000
当我收到我的userinput参数时,我正在代码的另一部分中这样做。我想创建一个单元测试来检查这一点。我在想,也许我必须做的只是测试当一个用户输入周期小于0或null时,我的间隔计时器仍然被检查为1000。我不知道这些信息是否存储在返回的文件中promise@acostela您可以尝试此更新,但我不确定它是否适合您的需要:|祝您好运!
it('myUnitTest', function(){
//Prepare data
var controller = createController();
expect(controller.myPromise).toBe( /* undefined? */);
});
function prepareInterval() {
self.callbacksData = [];
if(self.DynamicValuesList !== null) {
self.myPromise = $interval;
self.myPromise(callbackFunction, userInputInterval * 1000);
}
}
it('myUnitTest', function(){
//Prepare data
var controller = createController();
spyOn(controller, 'myPromise');
expect(controller.myPromise).toHaveBeenCalledWith(jasmine.any(Function), jasmine.stringMatching(/^[1-9][0-9]*$/));
});