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);
            });
        });
};

そして、これがspecファイル内で呼び出す方法です。

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ブロックを削除すると、仕様は期待値を表示します。promise 内の単純な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

すべての describe ステートメントと it ステートメントは同期する必要があります。Mocha/Jasmine は、スクリプトの開始時に情報を読み取ります。すべての非同期のものは、it/beforeEach/afterEach などの cb 関数内にある必要があります。

非同期データに基づいてテスト ケースを作成することはできません。唯一の解決策は、すべてのケースに対して 1 つの大きな 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

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 に答える