如何让jasmine测试加载数据并按正确的顺序执行

时间:2015-12-10 18:18:47

标签: javascript jasmine protractor

我使用Jasmine(2.3.2)和Protractor(2.5.1)进行UI测试。我需要加载数据并为该数组中的每个项生成测试。我有一个函数(checkItem)为每个项创建一个新的describe函数,并检查该对象的某些属性。这是我的代码的一个非常简化的版本,还有其他测试在这些之前运行。

如果我在checkItem声明中致电describe,则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 / { {1}}

beforeEach

1 个答案:

答案 0 :(得分:2)

您收到一个未定义的describe因为内部beforeAll中的代码在此过程的早期和it完成获取数据之前执行。用describe代替beforeAll可以让它等待it完成。

it现在的问题是你不能嵌套it s - jasmine不会执行它的内部,请参阅this relevant issue

如果您不想动态创建内部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(); }); }); }); 中表达您的期望 - 这将会起作用。工作样本:

Expected false to be truthy

它产生3次{{1}}次失败。

我仍然认为如果我们尝试使用 Protractor的控制流,我们可能会有更好的解决方案。