【问题标题】:Jasmine test private callback functionJasmine 测试私有回调函数
【发布时间】:2016-10-18 17:23:42
【问题描述】:

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

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

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

我的回调函数只显示来自回调函数的数据。如果该回调函数已被调用,我想进行 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 函数中注入了角度模拟

【问题讨论】:

  • 所以回调函数是私有的?
  • @Randy 完全正确。该 callbackFunction 未在我的 self 对象中定义,因为结果未公开。我想检查是否调用了该私有函数。

标签: javascript angularjs jasmine


【解决方案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? */);
});

更新

只是为了测试区间值>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]*$/));
});

【讨论】:

  • 好的,你的答案是我在其他情况下应用的,它是正确的。也许我必须改变我的问题,因为如果您检查我的间隔取决于用户输入参数。我想检查一下,即 userInputInterval 小于 0 或 null 我仍然每 1000 毫秒调用一次间隔。这就是我想检查我的回调函数是否被调用的原因,然后我增加了我附加的链接中看到的票证
  • 顺便说一句,如果userInputInterval userInputInterval && userInputInterval > 1 ? userInputInterval * 1000 : 1000
  • 当我收到用户输入参数时,我正在代码的其他部分执行此操作。我想创建一个单元测试来检查它。我在想,也许我必须做的只是测试当用户输入周期小于 0 或 null 时,我的间隔计时器仍然检查为 1000。我不知道该信息是否存储在返回的承诺中
  • @acostela 您可以尝试此更新,但我不确定它是否适合您的需求:|无论如何,现在祝你好运!
猜你喜欢
  • 1970-01-01
  • 2018-01-16
  • 2018-11-15
  • 1970-01-01
  • 2016-12-18
  • 2014-12-22
  • 2018-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多