我正在使用量角器编写测试,它总是在 $ timeout 完成时等待。
如果我使用 ignoreSynchronization = true; ,它会停止等待并提前测试。但是对于我的测试,我应该设置回 ignoreSynchronization = false; 。当我将其设置为false时,量角器停止并开始等待之前的 $ timeout 将完成。
我使用 $ timeout 作为通知窗口,并使用此窗口显示验证错误。目前我正在测试验证,它使测试非常慢。
因此 ingnoreSynchronization = true 的解决方案与我不兼容。
我试过 $ timeout.flush()但是它会导致错误 $ timeout.flush不是函数
我尝试使用ngMock但不确定是否可以将它与量角器一起使用。
有人解决了这个问题吗?
答案 0 :(得分:1)
作为与Angular应用程序同步的一部分,Protractor应该在执行之前等待任何$ timeout或$ http调用完成。由于你连续使用$ timeout,你有几个选择:
量角器默认会跟踪未完成的$ timeouts,并报告它们 如果量角器未能及时与Angular同步,则会显示错误消息。 为了做到这一点,Protractor需要装饰$ timeout。 注意:如果您的应用程序装饰$ timeout,则必须打开此标志。这个 默认为false。
untrackOutstandingTimeouts: false
,
browser.ignoreSynchronization = true
以将您的应用视为“非角度”,并使用预期条件在执行测试之前等待某些元素存在。资料来源:Expected Conditions 答案 1 :(得分:1)
我有同样的问题。我们在通知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,但如果它们由你创建并且你知道你要解雇哪些,你可以像这样定位它们。
答案 2 :(得分:0)
您似乎没有等待将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;
});