我正在使用 Jasmine (2.3.2) 和 Protractor (2.5.1) 进行 UI 测试。我需要加载数据并为该数组中的每个项目生成测试。我有一个函数 (checkItem
),它为每个项目创建一个新的 describe
函数并检查该对象的某些属性。这是我的代码的一个非常简化的版本,并且在这些之前运行了其他测试。
如果我在 describe
语句中调用 checkItem
,itemsArr
尚未定义。所以我不确定如何加载数据并根据该数据创建动态测试。
var data = require('get-data'); //custom module here
describe('Test', function() {
var itemsArr;
beforeAll(function(done) {
data.get(function(err, result) {
itemsArr = result; //load data from module
done();
});
})
//error: Cannot read property 'forEach' of undefined
describe('check each item', function() {
itemsArr.forEach(function(item) {
checkItem(item);
});
});
function checkItem (item) {
var itemName = item.name;
describe(itemName, function() {
console.log('describe');
//this doesn't fire when 'should check item' is called
it('should work', function() {
console.log('it');
expect(false).toBeTruthy();
});
});
}
});
更新:当我像这样更改我的代码时,它是同一个问题,所以也许有另一种方法来加载数据而不是使用 beforeAll
/beforeEach
beforeAll(function() {
itemsArr = [
{
name: 'apple'
},
{
name: 'orange'
},
{
name: 'banana'
}
]
});
最佳答案
您得到一个未定义的 itemsArr
,因为内部 describe
中的代码在流程的早期执行,并且在 beforeAll
完成获取数据。用 it
代替 describe
会让它等待 beforeAll
完成。
it
现在的问题是您不能嵌套 it
- jasmine 不会执行内部 its,请参阅 this relevant issue .
如果您不想动态创建内部 it
,而只是在父级 it
中设定您的期望 - 这将起作用。工作样本:
describe('Test', function() {
var itemsArr;
beforeAll(function(done) {
itemsArr = [
{
name: 'apple'
},
{
name: 'orange'
},
{
name: 'banana'
}
];
done();
});
it('should check each item', function() {
itemsArr.forEach(function(item) {
expect(false).toBeTruthy();
});
});
});
它产生 3 个 Expected false to be truthy
失败。
我仍然认为,如果我们尝试使用 Protractor 的控制流,我们可能会有更好的解决方案。
关于javascript - 如何让 Jasmine 测试加载数据并以正确的顺序执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34208999/