2017-06-10 23 views
0

私はJavaScriptエコシステムの初心者です。私は、Mocha/Chaiを使用してREST API用のAPIテストを作成しようとしています。私の要件は、各テストケースを実行する前にデータベースをクリーンアップする必要があるということです。私の中で今Mochaでテストを実行する前にbefore()を実行する方法を教えてください。

var dbCleanup = require('./dbCleanup.js').dbCleanup; 

function _beforeClean(done) { 
    try { 
     dbCleanup() 
      .then(done) 
    } catch (err) { 
     console.error(err); 
    } 
} 

exports.beforeCleanup = _beforeClean; 

:だから、私は次のコードを持っているglobalBefore.jsを別のファイルを呼び出した

var config = require("config.json"); 
const pg = require('pg'); 

var connectionString = config.pgConnectionString 
console.log("DB Connection String: ", connectionString) 

function dbCleanup() { 

    var dbTables = ["projects", "employees"]; 

    var pgClient = new pg.Client(connectionString); 

    var promise = new Promise(function (resolve, reject) { 
     pg.connect(connectionString, (err, pgClient, done) => { 
      if (err) { 
       done(); 
       console.log(err); 
       reject(); 
      } 

      for (i = 0; i < dbTables.length; i++) { 
       query = "TRUNCATE " + dbTables[i] + " CASCADE;" 
       pgClient.query(query, function (err, res) { 
        if (err) { 
         done(); 
         console.error('error running query', err); 
         reject(); 
        } 
        resolve(); 
       }); 
      } 
     }); 
    }); 

    pgClient.end() 

    return promise; 
} 

exports.dbCleanup = dbCleanup; 

dbCleanup.jsと呼ばれるファイルに次のコードを書きましたモカtest.jsファイル、私は次のようにデータベースのクリーンアップ機能を呼び出そう:

var request = require("request"); 
var rp = require("request-promise"); 
var config = require("../config.json"); 
var expect = require('chai').expect; 
var data = require("./data.json"); 

var globalBefore = require("../globalBefore.js"); 


describe("POST /employees/", function() { 

    console.log("clearing db tables...") 
    before(globalBefore.beforeCleanup, function (done) { 
     done(); 
    }); 

    beforeEach(function (done) { 
    ... do some business logic related work here ... 
    }); 


    it.only('Try create an employee', function (done) { 
    ... API call to create an employee and use Chai assertions to validate ... 
    }); 
}); 

私が直面している問題は、MochaはdbCleanup()関数が完了する前にもテストを実行することです。これは私のDBがkaputに行くのを引き起こし、私は望ましくない動作に遭遇する。

SOコミュニティから誰でも助けてください。私はウェブで見つけることができるさまざまなオプションを試しましたが、問題を修正することはできませんでした。コードの断片に示されているように、私は約束を使用すると、モカがためそれ句を実行する前にどのように私が完了するまでに前句内部の指示を強制しない、より汎用的であるために問題

を解決している必要があることを期待しテスト?

ありがとうございます!

答えて

1

あなたはbeforeを間違った方法で使用しています。代わりにこれを試してみてください:

before(function (done) { 
    globalBefore.beforeCleanup(done); 
}); 

または

before(globalBefore.beforeCleanup); 

そしてglobalBefore.jsに:

var dbCleanup = require('./dbCleanup.js').dbCleanup; 

function _beforeClean(done) { 
    dbCleanup().then(done).catch(done); 
} 

exports.beforeCleanup = _beforeClean; 

例(私は別の約束を使用するようにdbCleanup.jsを変更)

dbCleanup.js

function dbCleanup() { 

    return new Promise(function (resolve, reject) { 
     setTimeout(resolve, 2000); 
    }); 

} 

exports.dbCleanup = dbCleanup; 

globalBefore.js

var dbCleanup = require('./dbCleanup.js').dbCleanup; 

function _beforeClean(done) { 
    dbCleanup().then(done).catch(done); 
} 

exports.beforeCleanup = _beforeClean; 

index.js

var globalBefore = require("../globalBefore.js"); 

describe("POST /employees/", function() { 

    this.timeout(5000); // because the promise take 2000ms 

    console.log("clearing db tables...") 
    before(function (done) { 
     console.log('before calling beforeCleanup'); 
     globalBefore.beforeCleanup(function() { 
      console.log('after calling beforeCleanup'); 
      done(); // done cleaning db 
     }); 
    }); 

    /* Without the console.logs 
    console.log("clearing db tables..."); 
    before(globalBefore.beforeCleanup) 
    */ 

    beforeEach(function (done) { 
     // ... do some business logic related work here ... 
     console.log('beforeEach'); 
     done(); 
    }); 


    it.only('Try create an employee', function (done) { 
     // ... API call to create an employee and use Chai assertions to validate ... 
     console.log('it'); 
     done(); 
    }); 
}); 

OUTPUT

clearing db tables... 

    POST /employees/ 
before calling beforeCleanup 
after calling beforeCleanup 
beforeEach 
it 
    √ Try create an employee 


    1 passing (2s) 

https://mochajs.org/#hooks

+0

ありがとうございます。私は両方のオプションを試してみましたが、私は同じ問題を抱えています。私のテストは、dbCleanup()関数が完了する前から実行を開始します。私は現在、私のクリーンアップ機能とPromisesを使用している方法が実際にその部分をしているのかどうかは不思議です:-( –

+0

'try/catch'にもエラーがあります。約束のためには、' Promise.catch私はそれを変更し、実際の例を追加しました。 – luisenrike

+0

解決策を詳しく説明してくれてありがとうございました。 –

関連する問題