2013-10-21 38 views
28

我喜欢使用控制台日志的反馈可能太多,有时我遇到的代码,作为惯例,我们已经在指令/服务/控制器中添加$超时,有时作为长为500毫秒,现在问题出在单元测试期间,我注意到只有console.logs直接在它的构造函数下被发送到业力并输出到屏幕上。超时如何在角色测试中运行在业力

将控制台日志封装在超时或更确切的说是$超时下的断言不会产生任何结果,如果忽略,超时的解决方案是什么?

回答

88

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

恕我直言角队是正确的,写作异步测试很烂。 'flush()'FTW。 – weltschmerz

+1

我碰到一篇文章,在测试的顶部使用$ timeout.flush,而不是之后。这种方法有什么不同? http://jasonwatmore.com/post/2015/03/06/AngularJS-Unit-Testing-code-that-uses-$timeout.aspx – Winnemucca

相关问题