unit-testing - 超时如何在 karma 中运行的 Angular 测试中工作

标签 unit-testing angularjs timeout karma-runner

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

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

最佳答案

在您的单元测试中,您加载 ngMock ,覆盖原始 $timeout用它的模拟。模拟 $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()
  })
})

关于unit-testing - 超时如何在 karma 中运行的 Angular 测试中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19484940/

相关文章:

.net - 如何使用 Moq 测试 lambda 函数?

angularjs - 尝试将 Kendo UI 与 AngularJS 和 Webpack 一起使用时出错

php - stream_socket_enable_crypto();禁用 stream_set_timeout

azure - StackExchange.Redis 超时

java - 如何在每个@Test之前运行@BeforeClass方法

c# - NUnit 在测试中保持静态数据

angularjs - POST 方法自动转换为 OPTIONS

AngularJS Yeoman + Grunt 构建脚本1014 IE9 无效字符

java - session 超时在 Java Web 应用程序中不起作用

unit-testing - Salesforce 测试抽象类