Jasmine测试私有回调函数

时间:2016-10-18 08:38:35

标签: javascript angularjs jasmine

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

我遇到的情况是我不知道如何实现我的目标。我想知道是否已从我的间隔调用回调函数。这是在角度控制器中实现的。

function prepareInterval() {
  self.callbacksData = [];
  if(self.DynamicValuesList !== null) {
    self.myPromise = $interval(callbackFunction, userInputInterval * 1000);
  }
}

我的回调函数只显示来自callbackFunction的数据。如果调用了callbackFunction,我想要unitTest,但我不能。

我尝试了https://makandracards.com/makandra/32477-testing-settimeout-and-setinterval-with-jasmine

it('myUnitTest', function(){
  //Prepare data
  var controller = createController();

  spyOn(controller, 'callbackFunction');
  expect(controller.callbackFunction).not.toHaveBeenCalled();
});

我得到的错误是。

  

callbackFunction()方法不存在

编辑:顺便说一句,我在beforeEach函数中注入角度模拟

1 个答案:

答案 0 :(得分:1)

我会采取略微不同的方法。

显然你不希望callbackFunction本身暴露,所以不要。保密。

但是,您可以将其作为值返回到self实例。

    self.myPromise = $interval(callbackFunction, userInputInterval * 1000);

所以你测试的是self.myPromise值。如果该值包含间隔,则已设置间隔,因此您可以非常确定已调用方法。

我希望self对象是控制器,所以你可以像这样测试self.myPromise的值:

it('myUnitTest', function(){
  //Prepare data
  var controller = createController();

  expect(controller.myPromise).toBe( /* undefined? */);
});

<强>更新

仅测试间隔值&gt; 0:

您可以尝试重构可测试性。我不确定stringmatcher是否适用于数字,现在我没有时间进行测试:)

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