在量角器

时间:2016-08-30 13:10:02

标签: angularjs protractor ngmock

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

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

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

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

我试过 $ timeout.flush()但是它会导致错误 $ timeout.flush不是函数

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

有人解决了这个问题吗?

3 个答案:

答案 0 :(得分:1)

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

  1. 将$ timeout更改为使用$ interval。资料来源:Protractor Timeouts
  2. 根据Protractor Master Conf
  3. 调整您的配置文件以考虑$ timeout
      

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

    1. 设置browser.ignoreSynchronization = true以将您的应用视为“非角度”,并使用预期条件在执行测试之前等待某些元素存在。资料来源:Expected Conditions

答案 1 :(得分:1)

我有同样的问题。我们在通知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,但如果它们由你创建并且你知道你要解雇哪些,你可以像这样定位它们。

答案 2 :(得分:0)

您似乎没有等待将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;
});