2015-06-26 67 views
3

我有一些事情發生在使用$ timeout或$ interval延遲的UI中。這裏有一個簡單的例子:模擬量角器中的時間流逝?

控制器代碼

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

HTML

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

我希望能夠創建一個終端到終端的量角器測試,測試是否等待10秒後#myElement顯示。我發現這樣做的唯一方法是調用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() { 

});