在量角器中刷新 $timeout
Flush $timeout in protractor
我正在使用量角器编写测试,它总是在等待 $timeout 完成。
如果我使用 ignoreSynchronization = true; 它会停止等待并提前运行测试。但是对于我的测试,我应该设置回 ignoreSynchronization = false;。当我将其设置为 false 时,量角器停止并开始等待之前的 $timeout 完成。
我使用 $timeout 通知 window 并使用此 window 显示验证错误。目前我正在测试验证,它使测试非常慢。
因此 ingnoreSynchronization = true 的解决方案与我不兼容。
我已经尝试 $timeout.flush() 但它会导致错误 $timeout.flush is not a function
我尝试使用 ngMock 但我不确定是否可以将它与量角器一起使用。
有人解决这个问题吗?
量角器应该在执行之前等待任何 $timeout 或 $http 调用完成,作为与 Angular 应用程序同步的一部分。由于您连续使用 $timeout,您有几个选择:
- 更改 $timeout 以改用 $interval。资料来源:Protractor Timeouts
- 调整您的配置文件以考虑 $timeout,取自 Protractor Master Conf:
Protractor will track outstanding $timeouts by default, and report them in
the error message if Protractor fails to synchronize with Angular in time.
In order to do this Protractor needs to decorate $timeout.
CAUTION: If your app decorates $timeout, you must turn on this flag. This
is false by default.
untrackOutstandingTimeouts: false
,
- 设置
browser.ignoreSynchronization = true
将您的应用视为 "Non-Angular" 并使用预期条件等待某些元素出现后再执行测试。资料来源:Expected Conditions
看来你不是在等待将 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;
});
我遇到了完全相同的问题。我们在通知 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;
});
});
});
...
它不会默认关闭所有 $timeouts,但如果它们是由您创建的并且您知道要关闭哪些超时,则可以像这样定位它们。
我正在使用量角器编写测试,它总是在等待 $timeout 完成。
如果我使用 ignoreSynchronization = true; 它会停止等待并提前运行测试。但是对于我的测试,我应该设置回 ignoreSynchronization = false;。当我将其设置为 false 时,量角器停止并开始等待之前的 $timeout 完成。
我使用 $timeout 通知 window 并使用此 window 显示验证错误。目前我正在测试验证,它使测试非常慢。
因此 ingnoreSynchronization = true 的解决方案与我不兼容。
我已经尝试 $timeout.flush() 但它会导致错误 $timeout.flush is not a function
我尝试使用 ngMock 但我不确定是否可以将它与量角器一起使用。
有人解决这个问题吗?
量角器应该在执行之前等待任何 $timeout 或 $http 调用完成,作为与 Angular 应用程序同步的一部分。由于您连续使用 $timeout,您有几个选择:
- 更改 $timeout 以改用 $interval。资料来源:Protractor Timeouts
- 调整您的配置文件以考虑 $timeout,取自 Protractor Master Conf:
Protractor will track outstanding $timeouts by default, and report them in the error message if Protractor fails to synchronize with Angular in time. In order to do this Protractor needs to decorate $timeout. CAUTION: If your app decorates $timeout, you must turn on this flag. This is false by default.
untrackOutstandingTimeouts: false
,
- 设置
browser.ignoreSynchronization = true
将您的应用视为 "Non-Angular" 并使用预期条件等待某些元素出现后再执行测试。资料来源:Expected Conditions
看来你不是在等待将 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;
});
我遇到了完全相同的问题。我们在通知 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;
});
});
});
...
它不会默认关闭所有 $timeouts,但如果它们是由您创建的并且您知道要关闭哪些超时,则可以像这样定位它们。