28

我喜欢使用控制台日志来获取反馈可能太多了,有时我会遇到按照惯例我们在指令/服务/控制器中添加 $timeout 的代码,有时长达 500 毫秒,现在问题出在单元测试期间,我注意到只有直接在 it 构造函数下的 console.logs 被发送到 karma 并输出到屏幕。

在超时下包装的控制台日志或者在 $timeout 下包装的断言不会产生任何结果,就像被忽略一样,超时的解决方案是什么?

4

1 回答 1

87

在你的单元测试中,你 load ,它用它的 mockngMock覆盖了原来的。$timeoutMock$timeout不像真正的 JavaScript 那样工作timeout。要让它调用其中的代码,您必须$timeout.flush()从您的单元测试开始。

如果$timeout像真正的那样工作timeout,您将不得不为所有使用$timeout.

这是一个使用简化函数的示例$timeout以及我如何测试它:

gaApi.getReport = function() {
  report = $q.defer()

  $timeout(function() {
    $http({method: 'GET', url: 'https://www.googleapis.com/analytics/v3/data/ga'})
      .success(function(body) {
        report.resolve(body)
      })
  }, 300)

  return report.promise
}

单元测试:

describe('getReport', function() {
  it('should return report data from Google Analytics', function() {
    gaApi.getReport().then(function(body) {
      expect(body.kind).toBe('analytics#gaData')
    })

    $timeout.flush()
    $httpBackend.flush()
  })
})
于 2013-10-21T07:15:49.040 回答