茉莉测试私有回调函数

Jasmine test private callback function

本文关键字:回调 函数 测试      更新时间:2023-09-26

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

我的情况是,我不知道该怎么做才能达到我想要的。我想知道一个回调函数是否从我的interval中被调用。这是在angular控制器中实现的。

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函数
中注入了角模拟

在这里我会采取稍微不同的方法。

显然你不希望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是否适用于数字,现在我自己没有时间进行测试:)

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