如何在业力中运行的角度测试中超时工作

use*_*582 28 unit-testing timeout angularjs karma-runner

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

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

M.K*_*afi 88

在你的单元测试中,你加载ngMock,$timeout用它的模拟覆盖orignal .模拟$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
}
Run Code Online (Sandbox Code Playgroud)

单元测试:

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()
  })
})
Run Code Online (Sandbox Code Playgroud)

  • 恕我直言,Angular团队的编写异步测试很糟糕.`flush()`FTW. (6认同)