我喜欢使用控制台日志反馈可能太多,有时我运行代码,作为惯例我们已经添加$ timeout在指令/服务/控制器,有时长达500毫秒,现在的问题是在单元测试,我注意到只有console.logs直接在它的构造函数被发送到karma并输出到屏幕。
包裹的控制台日志在超时或更换包裹断言在$超时不产生任何结果,如果被忽略,什么是超时的解决方案?
在你的单元测试中,你加载ngMock,它用它的模拟覆盖原始的$ timeout。 Mock $ timeout不像真正的JavaScript超时那样工作。要让它调用它里面的代码,你必须做$ timeout.flush()从你的单元测试。
如果$ 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() }) })