Jasmine,AngularJS:单元测试一个在超时后返回值的函数

时间:2017-07-17 23:31:05

标签: javascript angularjs unit-testing jasmine karma-jasmine

我不确定此测试在哪里出错。

服务代码:

self.clearMessage = function(interval) {
  if (!interval)
    interval = 2000;

  return $timeout(function() {
    return '';
  }, interval);
};

规格:

it('clears message', function() {
  var result = self.clearMessage();

  $timeout.flush();

  expect(result).toBe('');
});

我也尝试在测试中触发摘要周期但没有成功。我以前从未遇到过这个问题,因为我通常会在超时块中设置一个外部变量 - 这对单元测试很有效。

在这种情况下,当超时内只有一个返回时,我收到以下错误:

Expected Promise({ $$state: Object({ status: 1, value: '' }), $$timeoutId: 1 }) to be ''.

编辑/答案



it('clears message', function() {
  self.clearMessage().then(function(response) {
    expect(response).toBe('');
  })

  $timeout.flush();
});




1 个答案:

答案 0 :(得分:1)

从您的服务代码中调用AngularJS的$timeout服务将为您返回一个承诺。当达到超时时,此承诺将......"得到解决。承诺将通过fn函数的返回值来解决。" https://docs.angularjs.org/api/ng/service/$timeout

你的规范中需要这样的东西:

var result = self.clearMessage();
result.then(function(value) {
  expect(value).toBe('');
});

$timeout.flush();  

JSFiddle