28
我喜欢使用控制台日志的反馈可能太多,有时我遇到的代码,作为惯例,我们已经在指令/服务/控制器中添加$超时,有时作为长为500毫秒,现在问题出在单元测试期间,我注意到只有console.logs直接在它的构造函数下被发送到业力并输出到屏幕上。超时如何在角色测试中运行在业力
将控制台日志封装在超时或更确切的说是$超时下的断言不会产生任何结果,如果忽略,超时的解决方案是什么?
我喜欢使用控制台日志的反馈可能太多,有时我遇到的代码,作为惯例,我们已经在指令/服务/控制器中添加$超时,有时作为长为500毫秒,现在问题出在单元测试期间,我注意到只有console.logs直接在它的构造函数下被发送到业力并输出到屏幕上。超时如何在角色测试中运行在业力
将控制台日志封装在超时或更确切的说是$超时下的断言不会产生任何结果,如果忽略,超时的解决方案是什么?
在您的单元测试中,您加载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()
})
})
恕我直言角队是正确的,写作异步测试很烂。 'flush()'FTW。 – weltschmerz
我碰到一篇文章,在测试的顶部使用$ timeout.flush,而不是之后。这种方法有什么不同? http://jasonwatmore.com/post/2015/03/06/AngularJS-Unit-Testing-code-that-uses-$timeout.aspx – Winnemucca