2012-10-25 48 views
4

更新2月 - 2013測試錯誤傳遞迴用回調與摩卡和應

使用與包裝的匿名函數的最後一個方式都可以引入一些奇怪的測試行爲。如果您希望拋出的錯誤,但有錯誤,在實際執行的測試將通過,但會把任何錯誤,可能不是您所期望的一個。我做了兩件事,如果我指定一個錯誤,我確保從存根返回的錯誤文本和拋出的錯誤是相同的。如果是從第三方的圖書館,我不一定知道的錯誤,我會放一些任意值,讓我知道通行證是特定於我測試的單位。使用sinon.js來存儲一些shizzle的例子。

it('should return an error if the save fails', function(){ 
     stubCall.restore(); 
     stubCall = sinon.stub(Provider, 'save').callsArgWith(1, new Error('Save Error')); 

     (function(){ 
      User.create(fakeUser, function(err, user){ 
       if(err) 
       throw err; 
      }); 
     }).should.throw("Save Error"); 
    }); 

我進入的Node.js,並試圖做摩卡和should.js一些行爲驅動開發(BDD)(和興農在那裏,以及在一些點)。

有一件事我有被用於測試由調用返回的錯誤,比如這個簡單的測試問題:

it('should return an error if you try and execute an invalid Query object', function() { 
     var stubQuery = {}; 

     Provider.execute(stubQuery, function (err) { 
      //should.not.exist(err); 
      should.have.property('message', 'Invalid Query Object'); 
     }); 
    }); 

與功能:

PostgresqlProvider.prototype.execute = function (query, cb) { 

};

不要緊,我嘗試和測試,測試始終通過(should.exist等),我可以得到它的第一次失敗的唯一途徑是通過增加CB(NULL);進入執行功能,這有點違揹我在做什麼,因爲我想添加行爲,而不是添加行爲測試失敗前進行測試。

我知道我在這裏做了一些真正的newb錯誤,可能在幾個層面上,但我沒有把握錯誤的測試,因爲回調不會被拋出(我相信我可以測試更容易)!

UPDATE

使用從赫爾曼的代碼,我調整,確實的話

 it('should return an error if you try and execute an invalid Query object', function() { 
     var stubQuery = {}; 
     Provider.execute(stubQuery, function (err) { 
      if (err) throw new Error(err); 
     }).should.throw(); 
    }); 

現在的問題是我不能「捕獲」(測試時沒有定義的行爲不及格)如果發送回調通過測試的錯誤,should.throw方法不會被調用,它只是指出,預計一拋發生但沒有即使我正在返回一個錯誤,從我的方法回調。這可能是因爲現代的範圍 但我不確定我是否應該添加某種形式的封閉,並在什麼水平。

更新2

想通了,我需要換一個封閉,而不是回調(DOH!)內調用函數,然後將斷言(should.throw)在結束關閉;

 it('should return an error if you try and execute an invalid Query object', function() { 
     var stubQuery = {}; 
     (function(){ 
      Provider.execute(stubQuery, function (err) {  
       if (err) 
        throw err; 
      }); 
     }).should.throw(); 
    }); 
+0

好的,我試了一下代碼。問題在於'should.throw()'檢查函數'Provider',而不是回調函數內部拋出異常,這就是測試通過的原因。使用'try..catch'塊代替(我的答案更新中有一個例子),當然,你可以想出比我的例子更優雅的東西:) –

+0

(ON UPDATE 2):LOL。我還沒弄清楚這個包裝器(函數()Provider ......',好的!) –

+0

我也遇到類似的情況。你知道是否有方法來測試錯誤對象而不會拋出它嗎?我一直嘗試類似:'''error.should.eql(new Error('my error'))''',但它似乎總是通過(即使錯誤文本錯誤)。 – snapfractalpop

回答

0

您需要在測試函數內部生成一個異常,以使測試失敗。

我想補充if (err) throw "Invalid query error " + err這樣:

it('should return an error if you try and execute an invalid Query object', function() { 
    var stubQuery = {}; 

    Provider.execute(stubQuery, function (err) { 
     if (err) throw "Invalid query error " + err 
    }); 
}); 

這應該做的。

(ON UPDATE)

should.throw()沒有爲我工作,要麼......我做了這個骯髒的黑客工作流程:

it('should return an error if you try and execute an invalid Query object', function() { 
    var stubQuery = {}; 

    try { 
    Provider.execute(stubQuery, function (err) { 
     if (err) throw "Invalid query error " + err 
    }); 
    // No error, keep on the flow 
    noError(); 
    } catch (e) { 
    // Error, let's continue the flow there 
    error (e) 
    } 

    function noError() { 
    // The flow in the event we have no error 
    // ... // 
    } 

    function error (errorObj) { 
    // The flow, in the event we have error 
    // ... // 
    } 

}); 

希望這有助於!

+0

嗨赫爾曼,謝謝你,這工作(測試失敗),但我無法得到should.throw工作現在通過它?我已更新與進展的問題。 – Modika

+0

去標記這是答案,因爲它得到原始的觀點並回答它,已經更新了問題以包括現在是wo的代碼爲我而生。 – Modika