在量角器中刷新$timeout



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

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

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

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

我已经尝试$timeout.flush()但它会导致错误$timeout。Flush不是函数

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

有人解决这个问题了吗?

我也有同样的问题。我们在通知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;
    });
  });
});
...

默认情况下,它不会排除所有的$timeout,但是如果它们是你创建的,并且你知道你想要排除哪些,你可以像这样定位它们

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

  1. 将$timeout改为$interval。来源:量角器超时
  2. 调整你的配置文件,以考虑$timeout,从量角器主配置:
默认情况下,

Protractor将跟踪未完成的$超时,并报告它们如果Protractor无法及时与Angular同步,就会出现错误信息。为了做到这一点,Protractor需要修饰$timeout。注意:如果你的应用装饰了$timeout,你必须打开这个标志。这默认为false。untrackOutstandingTimeouts: false,

  • 设置browser.ignoreSynchronization = true,将你的应用视为"非angular",并使用预期条件等待某些元素在执行测试之前出现。来源:预期条件
  • 似乎您没有等待将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;
    });
    

    相关内容

    • 没有找到相关文章

    最新更新