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

How to get jasmine tests to load data and execute in the right order

本文关键字:执行 顺序 数据 jasmine 测试 加载      更新时间:2023-09-26

我正在使用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();
      });
    });
  }
});

UPDATE:当我这样更改代码时,问题是一样的,所以可能有另一种方法来加载数据,而不是使用beforeAll/beforeEach

beforeAll(function() {
  itemsArr = [
    {
      name: 'apple'
    },
    {
      name: 'orange'
    },
    {
      name: 'banana'
    }
  ]
});

您得到的是一个未定义的itemsArr,因为内部describe中的代码在进程的早期执行,并且在beforeAll完成获取数据之前执行。用it代替describe将使其等待beforeAll完成。

现在it的问题是不能嵌套it s-jasmine不会执行内部its,请参阅此相关问题。

如果你不想动态地创建内部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的控制流,我们可能会有更好的解决方案。