我有一个包含多个规格的套件。每个规范都使用某些库上的代码,这些库在失败时返回被拒绝的承诺。
我很容易catch
那些在我的规范中拒绝的承诺。我想知道的是,如果我可以让Protractor退出catch
函数内的整个套件,因为同一套件中的下一个规格取决于之前规格的成功。
假设我有一个名为testEverything
的套件,其中包含openApp
,signIn
,checkUser
,logout
这些规格。如果openApp
失败,则所有下一个规范都将因依赖而失败。
请考虑openApp
的代码:
var myLib = require('./myLib.js');
describe('App', function() {
it('should get opened', function(done) {
myLib.openApp()
.then(function() {
console.log('Successfully opened app');
})
.catch(function(error) {
console.log('Failed opening app');
if ( error.critical ) {
// Prevent next specs from running or simply quit test
}
})
.finally(function() {
done();
});
});
});
我将如何退出整个测试?
答案 0 :(得分:2)
npm
有一个名为protractor-fail-fast
的模块。安装模块npm install protractor-fail-fast
。以下是他们将此代码放入您的conf文件的网站示例:
var failFast = require('protractor-fail-fast');
exports.config = {
plugins: [{
package: 'protractor-fail-fast'
}],
onPrepare: function() {
jasmine.getEnv().addReporter(failFast.init());
},
afterLaunch: function() {
failFast.clean(); // Cleans up the "fail file" (see below)
}
}
他们的网址是here。
答案 1 :(得分:1)
我设法找到了解决方法。现在我使用的实际代码更复杂,但想法是一样的。
我在量角器的配置文件bail
中添加了一个全局变量。请考虑配置文件顶部的以下代码:
(function () {
global.bail = false;
})();
exports.config: { ...
上面的代码使用IIFE(立即调用的函数表达式),它在量角器的bail
对象上定义global
变量(在整个测试过程中都可用)。
我还为我需要的Jasmine匹配器编写了异步包装器,它将执行expect
表达式,然后进行比较,并返回一个promise(使用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
全局变量,具体取决于哪种类型的期望失败。我最终编写了一个库(非常小),将故障区分为关键和非关键,然后使用它,只有在发生严重故障时才会停止规范。