3

我有一个显示 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 秒后隐藏一条消息。

我注意到 e2e 场景运行程序会阻塞,直到超时刷新,并且我无法检查是否显示了 flash 消息。

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

4

3 回答 3

2

正如@christian-smith 所述,我看不到调用inject()端到端测试的方法;此方法适用于标准 Jasmine 测试,而不是 e2e 测试运行器。

我创建了一个Plunker来演示。

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

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

于 2013-02-04T11:04:06.540 回答
1

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

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

于 2012-12-15T21:33:12.350 回答
1

我们在 $timeout 上遇到了类似的问题——我们的应用程序必须每 5 分钟执行一次 XHR——所以我们有一个函数可以每 5 分钟设置一次重复发生的 $timeout。这打破了我们的 e2e 测试,因为他们正在等待 angular 完成其工作,然后再继续,而这从未发生过。

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

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

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

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

这样,调用 $timeout 之间就有 1s 的间隔。运行 e2e 测试时,每 1 秒添加一个新的 $timeout (0ms),它会立即执行并继续测试。这对我们的 e2e 测试的性能影响约为 0,目前运行良好。

于 2013-07-19T08:47:05.033 回答