1

我正在使用量角器编写测试,它总是等待$timeout完成。

如果我使用ignoreSynchronization = true; 它停止等待并且测试提前运行。但是对于我的测试,我应该回退ignoreSynchronization = false; . 当我将其设置为 false 时,量角器停止并开始等待之前的$timeout完成。

我将$timeout用于通知窗口并使用此窗口显示验证错误。目前我正在测试验证,它使测试非常慢。

所以ingnoreSynchronization = true的解决方案对我来说不兼容。

我试过$timeout.flush()但它会导致错误$timeout.flush is not a function

我尝试使用ngMock,但不确定是否可以将其与量角器一起使用。

有人解决这个问题吗?

4

3 回答 3

1

我有同样的问题。我们在通知 UI 上使用超时,每次显示通知时它都会暂停应用程序,直到它自行关闭。这对我们有用:

Protractor 允许您从测试中注入模块。所以我们所做的是将我们的超时持续时间参数移动到 aconstant中,在运行量角器测试时可以将其设置为 0。

在您的模块中:

.constant('NOTIFICATION_CONSTANTS', {
  TIMEOUT_DURATION: 5000
})

.controller('NotificationController', function($scope, NOTIFICATION_CONSTANTS) 
{
  $scope.showNotification = function() {
    $timeout(function() { hideNotification(); }, NOTIFICATION_CONSTANTS.TIMEOUT_DURATION)
  };
})

在量角器测试中:

...
beforeAll(function() {
  browser.addMockModule('testConfig', function() {
    angular.module('testConfig', []).run(function(NOTIFICATION_CONSTANTS) {
      NOTIFICATION_CONSTANTS.TIMEOUT_DURATION = 0;
    });
  });
});
...

默认情况下它不会关闭所有 $timeouts,但如果它们是由您创建的并且您知道要关闭哪些,您可以像这样定位它们。

于 2017-11-09T19:06:10.827 回答
1

Protractor 应该在执行之前等待任何 $timeout 或 $http 调用完成,作为与 Angular 应用程序同步的一部分。由于您连续使用 $timeout,您有几个选择:

  1. 将您的 $timeout 更改为使用 $interval 。来源:量角器超时
  2. 调整你的配置文件以考虑 $timeout,取自Protractor Master Conf

Protractor 默认会跟踪未完成的 $timeouts,如果 Protractor 未能及时与 Angular 同步,则会在错误消息中报告它们。为了做到这一点,量角器需要装饰 $timeout。注意:如果你的应用装饰了 $timeout,你必须打开这个标志。默认情况下这是错误的。 untrackOutstandingTimeouts: false,

  1. 设置browser.ignoreSynchronization = true为将您的应用程序视为“非 Angular”,并使用预期条件等待某些元素出现,然后再执行测试。资料来源:预期条件
于 2016-08-30T15:48:13.087 回答
0

似乎您没有等待设置ignoreSynchronizationtrueor的承诺的解决方案false。我会尝试在控制流上推送一个函数来设置属性:

// disable the synchronization
browser.controlFlow().execute(function() {
  browser.ignoreSynchronization = true;
});

// execute some asynchronous code
...

// enable the synchronization
browser.controlFlow().execute(function() {
  browser.ignoreSynchronization = false;
});
于 2016-08-30T15:56:43.477 回答