我正在使用量角器编写测试,它总是等待$timeout将完成。
如果我使用ignoreSynchronization = true;它停止等待并提前测试运行。但是对于我的测试,我应该设置ignoreSynchronization = false;。当我将其设置为false时,量角器停止并开始等待前面的$timeout将完成。
我使用$timeout作为通知窗口,并使用此窗口显示验证错误。目前我正在测试验证,它使测试非常慢。
所以ingnoreSynchronization = true的解决方案对我来说是不兼容的。
我已经尝试$timeout.flush()但它会导致错误$timeout。Flush不是函数
我尝试使用ngMock,但我不确定是否可以使用它与量角器。
有人解决这个问题了吗?
我也有同样的问题。我们在通知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,但是如果它们是你创建的,并且你知道你想要排除哪些,你可以像这样定位它们
Protractor应该在执行之前等待任何$timeout或$http调用完成,作为与Angular应用同步的一部分。由于你连续使用$timeout,你有几个选项:
- 将$timeout改为$interval。来源:量角器超时
- 调整你的配置文件,以考虑$timeout,从量角器主配置:
默认情况下,Protractor将跟踪未完成的$超时,并报告它们如果Protractor无法及时与Angular同步,就会出现错误信息。为了做到这一点,Protractor需要修饰$timeout。注意:如果你的应用装饰了$timeout,你必须打开这个标志。这默认为false。
untrackOutstandingTimeouts: false
,
- 设置
browser.ignoreSynchronization = true
,将你的应用视为"非angular",并使用预期条件等待某些元素在执行测试之前出现。来源:预期条件
似乎您没有等待将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;
});