Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何让jasmine测试加载数据并以正确的顺序执行_Javascript_Jasmine_Protractor - Fatal编程技术网

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

Javascript 如何让jasmine测试加载数据并以正确的顺序执行,javascript,jasmine,protractor,Javascript,Jasmine,Protractor,我使用Jasmine(2.3.2)和量角器(2.5.1)进行UI测试。我需要加载数据并为该数组中的每个项目生成测试。我有一个函数(checkItem),它为每个项创建一个新的descripe函数,并检查该对象的某些属性。这是我的代码的一个非常简化的版本,在此之前还运行了其他测试 如果在descripe语句中调用checkItem,则尚未定义itemsArr。因此,我不确定如何加载数据并从该数据创建动态测试 var data = require('get-data'); //custom modu

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

如果在
descripe
语句中调用
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(function() {
  itemsArr = [
    {
      name: 'apple'
    },
    {
      name: 'orange'
    },
    {
      name: 'banana'
    }
  ]
});

您正在获取一个未定义的
项,因为内部
描述
中的代码在过程的早期执行,并且在
完成获取数据之前执行。用
it
代替
descripe
可以让它在完成之前等待

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

如果您不想动态地创建内部
it
s,而只是在父级
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个预期为假的故障



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

不一定是答案,但如果您可以放弃通过AJAX加载数据,您可以研究。它目前在NodeJS中不起作用,但基本前提非常简单。@cocoa好的,如果我错了,请纠正我-即使
itemsArr
descripe('Check item',function(){
?谢谢。是的,如果我
descripe('Check item',function(){itemsArr.forEach(function(item){checkItem(item);})中也会发生这种情况;   })
@cocoa好的,只是为了确保-这是您正在使用的jasmine2,对吗?请您也检查一下,在每个
之前将
临时替换为
是否有任何区别?谢谢。@cocoa好的,根据我对问题的看法更新了答案。希望这会有所帮助。谢谢您的回答,这似乎是最好的方法