angular.js e2e测试和$超时问题

时间:2012-12-14 09:48:28

标签: javascript angularjs

我有一个简单的服务来显示Flash消息https://github.com/lucassus/mongo_browser/blob/master/app/assets/javascripts/app/services.js.coffee#L31,我正试图在e2e规范https://github.com/lucassus/mongo_browser/blob/master/spec/javascripts/e2e/databases_scenario.js.coffee#L66中测试它 我使用$ timeout服务在3秒后隐藏flash消息。

我注意到e2e场景运行器阻塞,直到超时刷新,我无法检查是否已显示Flash消息。

如何在e2e规格中使用$ timeout测试功能? 是否有可能在不将模拟服务注入实际应用程序的情况下测试这种行为?

3 个答案:

答案 0 :(得分:2)

我没有看到在端到端测试中调用inject()的方法,正如@ christian-smith所描述的那样;这种方法适用于标准的Jasmine测试,而不是e2e测试运行。

我创建了一个Plunker来演示。

在示例中,$timeout(halfHourAction, 30*1000, false);中对app.js的调用意味着测试不会开始运行30秒。

在我的RealWorld®示例中,我实际上每30分钟轮询一次,因此应用程序永远不会开始运行。即使能够刷新$browser队列,也只会添加另一种方法。

答案 1 :(得分:1)

您可以使用sleep(seconds)让测试等到$ timeout代码完成。请参阅文档中此页面上的API部分:http://docs.angularjs.org/guide/dev_guide.e2e-testing

此外,$timeoutflush()方法,您可能会觉得有帮助。只需在测试中注入$ timeout并在任何断言之前调用flush。

答案 2 :(得分:1)

我们在$ timeout时遇到了类似的问题 - 我们的应用程序必须每隔5分钟执行一次XHR - 所以我们有一个函数可以每隔5分钟设置一次重新发生的$ timeout。这打破了我们的e2e测试,因为他们在继续之前等待角度完成其工作,这从未发生过。

这是我解决这个问题的方法:

  • 超时值被移动为配置,然后被模拟 - 在我们的应用程序的真实版本中,值来自后端,在我们的应用程序的测试版本中,我们使用ngMockE2E来模拟超时值。

  • 在测试模拟中,超时的时间间隔设置为0ms。

  • 在设置$ timeout的函数中,我们添加了一个普通的javascript setTimeout(...,1000),在设置新的$ timeout之前等待1秒。

这样,调用$ timeout之间有1s的间隔。当运行e2e测试时,每1秒添加一个新的$ timeout(0ms),立即执行并继续测试。这对我们的e2e测试的性能影响很大,并且现在工作得非常好。