在量角器中刷新 $timeout

Flush $timeout in protractor

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

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

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

因此 ingnoreSynchronization = true 的解决方案与我不兼容。

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

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

有人解决这个问题吗?

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

  1. 更改 $timeout 以改用 $interval。资料来源:Protractor Timeouts
  2. 调整您的配置文件以考虑 $timeout,取自 Protractor Master Conf:

Protractor will track outstanding $timeouts by default, and report them in the error message if Protractor fails to synchronize with Angular in time. In order to do this Protractor needs to decorate $timeout. CAUTION: If your app decorates $timeout, you must turn on this flag. This is false by default. untrackOutstandingTimeouts: false,

  1. 设置 browser.ignoreSynchronization = true 将您的应用视为 "Non-Angular" 并使用预期条件等待某些元素出现后再执行测试。资料来源:Expected Conditions

看来你不是在等待将 ignoreSynchronization 设置为 truefalse 的承诺的决议。我会尝试在控制流上推送一个函数来设置 属性:

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

// execute some asynchronous code
...

// enable the synchronization
browser.controlFlow().execute(function() {
  browser.ignoreSynchronization = false;
});

我遇到了完全相同的问题。我们在通知 UI 上使用超时,每次我们显示通知时它都会暂停应用程序,直到它自行消失。这对我们有用:

Protractor 允许您从测试中注入模块。所以我们所做的是将我们的超时持续时间参数移动到 constant,当 运行 量角器测试时可以将其设置为 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,但如果它们是由您创建的并且您知道要关闭哪些超时,则可以像这样定位它们。