我有一些使用$ timeout或$ interval在延迟时间内在UI中发生事件的地方。这是一个简化的例子:
控制器代码:
Object
HTML :
$timeout(function() {
$scope.showElement = true;
}, 10000);
我希望能够创建一个端到端的Protractor测试,测试#myElement在等待10秒后是否显示。我发现这样做的唯一方法是调用browser.sleep(10000),这导致我的测试实际延迟10秒。这有效,但这些暂停加起来会大大增加我的测试持续时间。想象一下你想测试一个模态是否在30分钟不活动后弹出的情况。
有没有办法模拟特定时间的传递,类似于茉莉花测试中的$ timeout.flush()?
答案 0 :(得分: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() {
});
答案 1 :(得分: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');
}
);