Мне удалось найти обходной путь. Фактический код, который я использовал, намного сложнее, но идея та же.
Я добавил глобальную переменную в файл конфигурации транспортира под названием bail
. Рассмотрим следующий код в верхней части файла конфигурации:
(function () {
global.bail = false;
})();
exports.config: { ...
В приведенном выше коде используется IIFE (выражение с немедленным вызовом функции), которое определяет переменную bail
в объекте транспортира global
(который будет доступен на протяжении всего теста).
Я также написал асинхронные оболочки для необходимых мне сопоставителей Jasmine, которые будут выполнять выражение expect
с последующим сравнением и возвращать обещание (с использованием модуля Q
). Пример:
var q = require('q');
function check(actual) {
return {
sameAs: function(expected) {
var deferred = q.defer();
var expectation = {};
expect(actual).toBe(expected);
expectation.result = (actual === expected);
if ( expectation.result ) {
deferred.resolve(expectation);
}
else {
deferred.reject(expectation);
}
return deferred.promise;
}
};
}
module.exports = check;
Затем в конце каждой спецификации я устанавливаю значение bail
на основе прогресса спецификации, который будет определяться обещанием этих асинхронных сопоставителей. Считайте следующее в качестве первой спецификации:
var check = require('myAsyncWrappers'); // Whatever the path is
describe('Test', function() {
it('should bail on next spec if expectation fails', function(done) {
var myValue = 123;
check(myValue).sameAs('123')
.then(function(expectation) {
console.log('Expectation was met'); // Won't happen
})
.catch(function(expectation) {
console.log('Expectation was not met'); // Will happen
bail = true; // The global variable
})
.finally(function() {
done();
});
});
});
Наконец, в начале следующих спецификаций я проверяю bail
и возвращаюсь, если необходимо:
describe('Test', function() {
it('should be skipped due to bail being true', function(done) {
if ( bail ) {
console.log('Skipping spec due to previous failure');
done();
return;
}
// The rest of spec
});
});
Теперь я хочу упомянуть, что существует один модуль под названием protractor-fail-fast
, который не справляется со всем тестом всякий раз, когда не выполняется ожидание.
Но в моем случае мне нужно было установить эту глобальную переменную bail
в зависимости от того, какое ожидание не удалось. Я закончил тем, что написал библиотеку (действительно небольшую), которая различает сбои как критические и некритические, а затем, используя это, спецификации будут остановлены только в случае возникновения критического сбоя.
10.05.2016
Control + C
. В вашем вопросе было задано, как остановить тест, если шаг не удался, что может сделать модуль, которым я ответил. Может я неправильно понимаю твой вопрос. 09.05.2016