javascript - 如何让 Jasmine 测试加载数据并以正确的顺序执行

标签 javascript jasmine protractor

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

如果我在 describe 语句中调用 checkItemitemsArr 尚未定义。所以我不确定如何加载数据并根据该数据创建动态测试。

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/

相关文章:

javascript - 同步多个 Promise,同时允许多次重试

javascript - 如何在打开模态时更新图像src

javascript - 如何在javascript中的if中将OR切换为AND

tfs - Chutzpah 在 TFS 2012 中运行 Jasmine 找不到被测试的引用文件

angularjs - 通过 gulp 启动 Protractor

Protractor如何断言具有相同css类的多个元素全部显示

javascript - 如何检查文件是否下载成功?

javascript - Jquery 图像交换 onLoad

javascript - 在 jasmine angular2 测试中获取 span 标签的值

javascript - jasmine.stringMatching 方法未定义