Angularjs 量角器中的刷新$timeout

Angularjs 量角器中的刷新$timeout,angularjs,protractor,ngmock,Angularjs,Protractor,Ngmock,我正在使用量角器编写测试,它总是等待$timeout完成 如果我使用ignoreSynchronization=true它停止等待,测试继续运行。但对于我的测试,我应该退后忽略同步=false。当我将其设置为false时,量角器停止并开始等待上一个$timeout将完成 我使用$timeout作为通知窗口,并使用此窗口显示验证错误。目前我正在测试验证,这使得测试非常缓慢 因此,ingnoreSynchronization=true的解决方案与我不兼容 我尝试过$timeout.flush(),但

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

如果我使用ignoreSynchronization=true它停止等待,测试继续运行。但对于我的测试,我应该退后忽略同步=false。当我将其设置为false时,量角器停止并开始等待上一个$timeout将完成

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

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

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

我试过使用量角器,但不确定是否可以使用量角器


有人解决了这个问题吗?

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

  • 将$timeout更改为使用$interval。资料来源:
  • 调整您的配置文件以考虑$timeout,取自:
  • 量角器将跟踪默认情况下未完成的$超时,并在中报告它们 如果量角器未能及时与角度传感器同步,则显示错误消息。 为了做到这一点,量角器需要修改$timeout。 警告:如果你的应用程序装饰$timeout,你必须打开此标志。这 默认情况下为false。
    未跟踪未完成超时:false

  • 设置
    browser.ignoreSynchronization=true
    将应用程序视为“非角度”,并在执行测试之前使用预期条件等待某些元素出现。资料来源:

  • 您似乎没有等待承诺的解决方案,即将
    ignoreSynchronization
    设置为
    true
    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;
    });
    

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

    量角器允许您从测试中注入模块。因此,我们所做的是将超时持续时间参数移动到一个
    常量中,当运行量角器测试时,该常量可以设置为0

    在您的模块中:

    在量角器测试中:


    默认情况下,它不会消除所有$timeout,但如果它们是由您创建的,并且您知道要消除哪些超时,则可以这样将它们作为目标。

    为什么
    ignoreSynchronization=true
    不是您的选项?您描述的体系结构没有意义。“我使用
    $timeout
    作为通知窗口…”实际上是什么意思?为什么要在弹出通知时强制angular等待?通过这种方式,您已经将应用程序逻辑与UI线程紧密耦合,这是一种代码味道,测试中的慢度也将表现为用户的慢度。似乎单元测试在确定一个考虑主要重构因素的地方已经完成了自己的工作。
    .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;
        });
      });
    });
    ...