2017-02-24 97 views
0

我想單元測試(摩卡&柴)在我的node.js應用程序池連接(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

請注意,這是一個集成測試,而不是單元測試。它測試了兩個系統在一起工作,而不是* your *應用程序中的單個功能單元獨立工作。請參閱http://stackoverflow.com/questions/1217736/how-to-write-unit-tests-for-database-calls以測試數據庫調用。 –

回答

2

你在第二個參數中傳遞給it的內容必須是一個函數。現在你正在做的:

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

pool.getConnection採用了回調,以便在所有的可能性,它返回undefined。所以它看起來像這樣摩卡:

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

這是一個懸而未決的測試,因爲有undefined回調是告訴摩卡測試掛起的方式。您需要將您的電話打包到pool.getConnection的功能:

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可以將它降低到你的答案中,但是如果有任何'連接'測試將被完成,那麼應該檢查'err'第一。 – Louis

+0

可以說我在對象構造函數中使用了'pool.getConnection()',並將查詢結果中的值賦給了我的對象屬性,'done()'調用會等到我的對象在調用'var user =新用戶(1);'例如? – Faegy

1

參見testing asynchronous code在摩卡文檔。你的it函數應該看起來類似於下面。

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

或者,如果你想添加您的回調中斷言執行以下操作:

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

注意你最好應與承諾的測試,因爲這允許您運行連接對象上expect報表,無需額外嘗試/ 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` 
    }); 
}); 

另外請注意,這些都不是「單元測試」,而是集成測試,因爲他們正在測試兩個系統一起工作,而不僅僅是你的應用程序運行得正如預期的那樣。