1

我在循环内使用 IT 块时遇到问题。循环基本上来自返回的 Promise,这是一个从 excel 文件中读取数据的exceljs模块。

这里'是承诺函数。

var excelJs = require('exceljs');
var Excel = browser.params.Excel;

this.createProfile = function() {
        var arr = [];
        return new Promise(function(fulfill, reject){
        var workbook = new excelJs.Workbook();

        workbook.xlsx.readFile(Excel.filePath).then(function(){    
            worksheet = workbook.getWorksheet(1);
            worksheet.eachRow({includeEmpty: true}, function(row, rowNumber)
                try {
                    if (rowNumber != 1) {
                        arr.push(row.values);
                        fulfill(arr);
                    }
                } catch(ex){reject(ex);}
              }, reject);
            });
        });
};

这是我在规范文件中调用的方式。

describe('Bulk Purchase', function(){

        var cp = createProfile();
        cp.then(function(data){
            for (var i in data){
                it('Automate School Supplies Purchase', function(done){
                    console.log('Ballpen: ' + data[i][1]);
                    console.log('Notebook: ' + data[i][2]); //etc
                    done();
                });
            }
        })
    });

如果我从代码中删除IT块,规范将显示预期值。有人可以告诉我为什么承诺中的简单IT块不起作用吗?任何帮助将不胜感激谢谢:)

我有一个解决方法,如果我将 Excel 转换为 JSON,并需要 json 文件并执行 forEach,那么我可以轻松地进行数据驱动的自动化测试。但我不希望从其他源文件移动来实现我原来的方法。

// where I used xlsx-to-json npm to convert my excel to json
var jsonData = require('path to converted excel to json file');

jsonData.forEach(function(data){
   it('Automate School Supplies Purchase', function(){
      console.log(data.Ballpen);
      console.log(data.Notebook); //etc
   })
});
4

3 回答 3

0

您可以使用“jasmine-data-provider”在没有任何 for 循环的情况下进行数据驱动测试。

Protractor 中的数据驱动测试

于 2016-10-22T16:18:08.303 回答
0

所有 describe 和 it 语句都需要同步。Mocha/Jasmine 阅读他们关于脚本启动的信息。您所有的异步内容都必须在它/beforeEach/afterEach 等的 cb 函数中。

您不能基于异步数据创建测试用例。唯一的解决方案是对所有情况都有一个大的 it 语句:

describe('Bulk Purchase', function() {
  it('Automate School Supplies Purchase', function(done) {
    var cp = createProfile();
    cp.then(function(data) {
      for (var i in data) {
        console.log('Ballpen: ' + data[i][1]);
        console.log('Notebook: ' + data[i][2]); //etc
      };
      done();
    });
  });
});
于 2016-10-21T08:52:31.280 回答
-1

找到了最好的,Node.js async to sync

deasync 包为我提供了解决方案。更新:对于那些想要我如何使用 deasync 的人。

/*** My function ***/
this.createProfile = function() {

    var arr = []; 
    // pseudo code goes here cont..
    arr.push = row.values

    // Deasync goes here
    while(arr === "undefined") {
      require('deasync').runLoopOnce();
    }
    return arr;
};

现在在我的规格测试中使用它。它做了我期望做的事。

 describe('Bulk Purchase', function(){

    var cp = createProfile(); // cp value is now a SYNC one
    cp.forEach(function(data, index){
       for (var i in data) {
         it('School Supplies purchase', function(done){
            console.log('Ballpen: ' + data[i][0];
            console.log('Books: ' + data[i][1];
         })
       }

    })
});
于 2017-01-07T06:15:46.663 回答