繁体   English   中英

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

[英]angular.js e2e test and $timeout issue

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

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

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

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

我已经创建了一个Plunker来演示。

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

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

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

另外, $ timeout有一个flush()方法,你可能会觉得有用。 只需在测试中注入$ timeout并在任何断言之前调用flush。

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

继承我解决这个问题的方法:

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM