2016-06-09 6 views
2

我有一個測試,看起來像這樣:Supertest預計未發出狀態代碼了

it('should fail to get deleted customer', function(done) { 
    request(app) 
     .get('/customers/'+newCustomerId) 
     .set('Authorization', 'Bearer ' + token) 
     .set('Accept', 'application/json') 
     .expect('Content-Type', /json/) 
     .expect(404, done) 
    }); 

我在這裏閱讀文檔:

https://github.com/visionmedia/supertest

它這樣說:

請注意如何通過直接完成.expect()調用

如果我將其更改爲.expect(200, done),那麼不工作的代碼行是.expect(404, done),那麼測試不會失敗。

不過,如果我添加結束這樣的:

it('should fail to get deleted customer', function(done) { 
    request(app) 
     .get('/customers/'+newCustomerId) 
     .set('Authorization', 'Bearer ' + token) 
     .set('Accept', 'application/json') 
     .expect('Content-Type', /json/) 
     .expect(200) 
     .end(function(err, res) { 
      if (err) console.log(err); 
      done(); 
     }); 
    }); 

然後測試失敗。爲什麼.expect(200, done)也不失敗?

回答

0

根據文件,這是預期的。 (https://github.com/visionmedia/supertest

如果您使用的是.END()方法.expect()失敗不會拋出斷言 - 他們將返回斷言爲錯誤的.END()回調。爲了使測試用例失敗,您需要重新拋出或通過err來完成()

當您同步聲明斷言時,您有義務手動處理錯誤。在你的第一個代碼片段中,.expect(404, done)永遠不會被執行,因爲在它到達之前拋出異常。

您的第二個片段按預期失敗,因爲它能夠處理該錯誤。由於該錯誤已傳遞給function(err, res) {}處理程序。

我覺得這很麻煩,幾乎要自我挫敗,必須以這種方式處理錯誤。所以更好的方法是使用承諾,以便可以自動處理錯誤,如下所示:

it('should fail to get deleted customer', function() { 
    return request(app) 
    .get('/customers/'+newCustomerId) 
    .set('Authorization', 'Bearer ' + token) 
    .set('Accept', 'application/json') 
    .expect('Content-Type', /json/) 
    .expect(200); 
}); 
+0

感謝您的迴應,這是2.0.0中的突破:https://github.com/ visionmedia/supertest /問題/ 345#issuecomment-229496425 –