Javascript Jasmine测试专用回调函数

Javascript Jasmine测试专用回调函数,javascript,angularjs,jasmine,Javascript,Angularjs,Jasmine,我知道在unitTests中直接调用私有函数不是一个好的实践,我们必须通过公共方法测试私有代码 我的情况是,我不知道该怎么做才能实现我想要的。我想知道是否从我的间隔调用了回调函数。这是在角度控制器中实现的 function prepareInterval() { self.callbacksData = []; if(self.DynamicValuesList !== null) { self.myPromise = $interval(callbackFunction, us

我知道在unitTests中直接调用私有函数不是一个好的实践,我们必须通过公共方法测试私有代码

我的情况是,我不知道该怎么做才能实现我想要的。我想知道是否从我的间隔调用了回调函数。这是在角度控制器中实现的

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]*$/));
});