2017-02-24 16 views
0

私のnode.jsアプリケーションで単体テスト(mocha & chai)のプール接続(mysql)をしたいと思います。私は正しい方法でテストを使用しているかどうかわかりませんが、そうであれば、なぜそれらが常に「保留中」として認定されているのでしょうか。プール接続の単体テスト方法は?

次のコードを与えると、どうすればテストできますか?

var pool = mysql.createPool({ 
    connectionLimit: 100, 
    host: 'localhost', 
    user: 'userName', 
    password: 'userPass', 
    database: 'userDatabase', 
    debug: false 
}); 

私は多くの方法で試しましたが、うまくいかないようです。クレデンシャルが正しいかどうかを返すことになる

describe("Database", function() { 
    describe("Connection", function() { 
     it("Should connect without an error", pool.getConnection(function (err, connection) { 
      expect(err).to.be.null; 
      }) 
     ); 
    }) 
}); 

、::

Express server listening on port 8080 
    Database 
    Connection 
     - Should connect without an error 


    0 passing (15ms) 
    1 pending 

とリターンの資格情報が正しくない場合、私が得たベストはこのだった

Express server listening on port 8080 
    Database 
    Connection 
     - Should connect without an error 
     1) Uncaught error outside test suite 


    0 passing (23ms) 
    1 pending 
    1 failing 

    1) Database Connection Uncaught error outside test suite: 
    Uncaught AssertionError: expected [Error: ER_DBACCESS_DENIED_ERROR: Access denied for user 'userName'@'localhost' to database 'userDatabase'] to be null 

は、事前にありがとうございます。

+0

これは単体テストではなく統合テストであることに注意してください。 *あなたのアプリケーションが単独でうまく機能しているのではなく、2つのシステムが一緒に動作することをテストします。データベース呼び出しをテストするにはhttp://stackoverflow.com/questions/1217736/how-to-write-unit-tests-for-database-callsを参照してください。 –

答えて

2

第2引数のitに渡すものは、関数でなければなりません。今、あなたがやっている:

it("Should connect without an error", pool.getConnection(...)) 

pool.getConnectionすべての可能性で、それはundefinedを返すように、コールバックを取ります。だから、モカに次のようになります。

it("Should connect without an error", undefined) 

とコールバックのためundefinedを有するテストが保留されているモカを指示する方法であるため、これは保留中のテストです。

it("Should connect without an error", function (done) { 
    pool.getConnection(function (err, connection) { 
     if (err) { 
      done(err); // Mocha will report the error passed here. 
      return; 
     } 
     // Any possible tests on `connection` go here... 

     done(); 
    }); 
}); 
+0

'expect(err).to.be.null'が例外をスローすると、' done() 'は呼び出されないため、タイムアウトするまでテストは解決されません。 –

+0

これは本当ですが、一般的に問題ではありません。テストが合格する時間の99.9999%でタイムアウトにヒットしません。それにもかかわらず、私はそれがすぐにどのように受け継がれるかを示すために私の答えを編集しました。OPがコールバックで他のテストを実行しない場合、OPはあなたの答えにそれを減らすことができますが、 'connection'のテストが行​​われる場合は' err'をチェックする必要があります最初。 – Louis

+0

そして、オブジェクトのコンストラクタで 'pool.getConnection()'を使い、クエリ結果の値を自分のオブジェクトのプロパティに代入すると、 'done()'コールは 'var user =新しいユーザー(1);たとえば? – Faegy

1

mochaドキュメントのtesting asynchronous codeを参照してください。 it関数は次のようになります。

it('Should connect without an error', function (done) { 
    pool.getConnection(done); 
}); 

それとも、あなたはコールバック内でアサーションを追加したい場合は次のようにします。これはあなたが余分にせずに、接続オブジェクトのexpectステートメントを実行することができますので、あなたが好ましく約束してテストする必要があります

it('Should connect without an error', function (done) { 
    pool.getConnection((err, connection) => { 
    try { 
     expect(connection).to.not.be.null; 
     expect(connection).to.have.property('foo'); 
     done(); 
    } catch (error) { 
     done(error); 
    } 
    }); 
}); 

注意try/catch/doneステートメント。 pool.getConnectionは約束を返す場合たとえば、あなたが行うことができます:

it('Should connect without an error', function() { 
    return pool.getConnection(connection => { 
    expect(connection).to.have.property('foo'); 
    // more assertions on `connection` 
    }); 
}); 

はまた、これらは、「単体テスト」が、統合テストではないことに注意して、彼らは2つのシステムがちょうどあなたのアプリケーションの挙動するのではなく、一緒に働くことをテストしているとして、それ自体が予想通りです。