2013-12-23 21 views
4

我正在使用運行在nodejs實例中的mocha測試存儲過程。我有這樣的測試框架:無法在同步模式下運行Mocha.js

var chai    = require('chai'), 
    MyReporter  = require("../MyReporter.js"), 
    chokidar   = require('chokidar'), 
    expect   = chai.expect, 
    should   = chai.should, 
    assert   = chai.assert; 

var Mocha = require('mocha'); 
amochai = new Mocha({ 
    bail: false, 
    debug: true 
}); 

amochai.addFile("mytest_v1.js"); 

function runMocha(callback) { 
    amochai.run(function() { 
    callback(); 
    }); 
} 

watcher.on('change', function(path, stats) { 
     runMocha(function() {}); 
} 

問題:我的測試中總是在異步模式下運行,雖然我的所有測試都這樣寫的:

describe('Mysql stored procedures', function(){ 
    describe('Add this data', function(){ 
     it('-- Should return this information', function(){ 
     // asserts 
     }); 
    }); 
}); 

沒有完成()回調,我的意思是任何地方,所以,正如在任何地方都提到mocha.js是默認同步的,可能是我的代碼在異步模式下運行的原因是什麼?

PATCH

要修補我的問題,我有()之前使用和檢查我的測試狀態,但是這成爲維護的噩夢。

+0

有什麼症狀可導致您認爲mocha異步運行測試? – Louis

+0

我正在node-inspector中運行這些測試,並且我可以通過斷點確認測試是並行運行的。我帶着調試人員去發現爲什麼我的測試是不連貫的。 – Alain

+0

如何同步調用存儲過程?你正在談論db存儲過程,對吧? – vkurchatkin

回答

12

您正在運行同步摩卡測試中異步的操作。

說摩卡測試是「同步」是不明確的。這可能意味着:

  • 測試測試的操作發生同步。
  • Mocha以同步方式處理測試。

這兩個不相等。一個不包含另一個。默認情況下,Mocha同步處理所有測試。我們可以使它異步處理一個測試,但爲我們傳遞給it(或其他測試接口中的等價物)的回調添加一個參數。 (後來摩卡的最終版本增加了一個方法,使摩卡處理異步測試:返回的希望,但是我會用回調下面的例子。)因此,我們可以有同步的4種組合:

  • 操作同步,摩卡測試同步。

    it("reads foo", function() { 
        fs.readFileSync("foo"); 
        // ssert what we want to assert. 
    }); 
    

    沒問題。

  • 操作同步,摩卡測試異步。

    it("reads foo", function (done) { 
        fs.readFileSync("foo"); 
        // Assert what we want to assert. 
        done(); 
    }); 
    

    Mocha測試是異步的,但沒有問題沒有意義。

  • 操作異步,Mocha測試異步。

    it("reads foo", function (done) { 
        fs.readFile("foo", function() { 
         // Assert what we want to assert. 
         done(); 
        }); 
    }); 
    

    沒問題。

  • 操作異步,摩卡測試同步。

    it("reads foo", function() { 
        fs.readFile("foo", function() { 
         // Assert what we want to assert. 
        }); 
    }); 
    

    這是一個問題。摩卡將立即返回測試回調並稱其成功(假設fs.readFile不會提出豁免)。異步操作仍將被調度,並且回調可能會在稍後調用。這裏重要的一點是:摩卡沒有能力讓它測試的操作同步。因此,在測試中使摩卡測試同步對操作沒有影響。如果它們是異步的,無論我們告訴摩卡,它們都將保持異步。

最後一種情況,在您的系統中會導致存儲過程的執行與DB系統排隊。如果這個排隊沒有錯誤發生,摩卡完成馬上。然後,如果文件發生更改,您的監視器將啓動另一次Mocha運行,並且更多操作正在排隊等。

+0

您可能會發現我的困惑,並清楚解釋我正在嘗試的行爲。它是有道理的:我正在同步摩卡運行模式下進行異步調用(調用nodejs mysql模塊)。我只是感到驚訝,摩卡並沒有「等」從測試人員那裏等待特定的回調消除測試人員責任性中的這種模糊性。 – Alain

+0

Hi @Louis, 如何處理第四個示例,你會有什麼建議? –

+0

@Mageshkhanna你必須把它變成第一或第三種情況。在我以代碼形式顯示的代碼中,它表示使用'fs.readFileSync'(第一種情況),或者將函數傳遞給'it'作爲'done'參數,並在回調(第三種)情況下調用它。 – Louis

相關問題