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

Posted

技术标签:

【中文标题】超时如何在 karma 中运行的角度测试中工作【英文标题】:how does timeout work in angular tests running in karma 【发布时间】:2013-10-29 09:06:42 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

在您的单元测试中,您加载了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()
  )
)

【讨论】:

恕我直言,Angular 团队的正确之处在于编写异步测试很糟糕。 flush()FTW。 我看到一篇文章在测试的顶部使用了 $timeout.flush 而不是在它之后。这种方法有什么区别? jasonwatmore.com/post/2015/03/06/…

以上是关于超时如何在 karma 中运行的角度测试中工作的主要内容,如果未能解决你的问题,请参考以下文章

在代理 testng 中工作时返回连接超时

嵌套组件如何在角度 5 或 6 中工作

Karma/Jasmine 在没有运行测试的情况下超时

如何使用反应测试库模拟 ResizeObserver 以在单元测试中工作

比特洪流如何在专用网络中工作?

Angular Karma 使用 CUSTOM_ELEMENTS_SCHEMA 测试超时测试 AppComponent