2015-06-26 2 views
3

У меня есть несколько мест, где в пользовательском интерфейсе происходят события с задержкой с использованием $ timeout или $ interval. Вот упрощенный пример:Имитировать время прохождения в транспортир?

код контроллера:

$timeout(function() { 
    $scope.showElement = true; 
}, 10000); 

HTML:

<div id="myElement" ng-show="showElement"></div> 

Я хочу быть в состоянии создать тест транспортир конца до конца, что проверяет, является ли #myElement отображается после 10 секунд ожидания. Единственный способ, который я нашел для этого, - вызвать browser.sleep (10000), что приводит к фактической 10-секундной задержке в моем тесте. Это работает, но эти паузы складываются и значительно увеличивают продолжительность моих тестов. Представьте себе ситуацию, когда вы хотели проверить, появляется ли модальное состояние после 30 минут бездействия.

Есть ли способ имитировать прохождение определенного количества времени, аналогично $ timeout.flush() в тесте на жасмин?

ответ

1

Вы можете сделать это потенциально, используя async.whilst. Идея заключается в том, чтобы продолжать поиск элемента до тех пор, пока не будет достигнут тайм-аут. Если элемент найден до того, как истечет время ожидания, или если элемент НЕ найден в течение таймаута, тест не проходит иначе, если он проходит. Я не тестировал это, но вы поняли эту идею. Например,

var driver = browser.driver, 
wd = browser.wd, 
async = require('async'), 
start = Date.now(), 
found = false, 
diff; 
async.whilst(
     function() { 
      var diff = Date.now() - start; 
      return diff <= 10000 && !found; 
     }, 
     function(callback) { 
     driver.findElement(wd.By.id('myElement')).then(function() { 
       found = true; 
       callback(); 
      },function(err) { 
      found = false; 
      callback(); 
     }); 
     }, 
     function (err) { 
      var isTesrPassed = !err && found && diff>=10000; 
      assertTrue(isTestPassed, 'element visibility test failed'); 
     } 
); 
3

Вы можете украсить $timeout и $interval отменить задержку, подаваемое на них:

нижнего выжидательную time.js

exports.module = function() { 
    angular.module('lowerWaitTimeDecorator', []) 
    .config(function($provide) { 
     $provide.decorator('$timeout', function($delegate) { 
      return function() { 
       // The second argument is the delay in ms 
       arguments[1] = arguments[1]/10; 
       return $delegate.apply(this, arguments); 
      }; 
     }); 
    }) 
}; 

Использование

beforeAll(function() { 
    var lowerWaitTime = require('lower-wait-time'); 
    browser.addMockModule('lowerWaitTimeDecorator', lowerWaitTime.module); 
}); 

afterAll(function() { 
    browser.removeMockModule('lowerWaitTimeDecorator'); 
}); 

it('My-sped-up-test', function() { 

});