2016-01-27 223 views
-1

我正忙於爲我寫的現有nodejs api構建功能測試。我正在使用摩卡和expect.js。用摩卡測試Node.js api

一個失敗的測試是當我想對url參數的存在做一個負面測試時。我想要的是如果param丟失,則將消息發回服務的使用者。

目前正測試我的作品:

var request = require('request'); 

it('get a specific user from the api', function (done) { 
    request.get('http://localhost:8080/api/v1/user/123', function (error, response, body) { ... }); 
}); 

但是,下列不工作,我得到的是一個超時:

it('should return a 400 message if UserId is not supplied stating that "UserId expected"', function(done) { 
    request.get('http://localhost:8080/api/v1/user/', function (error, response, body) { 
     if (!error && response.statusCode == 400) { 
      expect(body).to.be.equal('UserId expected'); 
      done(); 
     } 
    }); 
}); 

兩個以上的測試正在測試該端點:

app.get('/api/v1/user/:userid', function (req, res) { 
    if(!req.params.userid) { 
     return res.status(400).json('UserId expected'); 
    } 

    ... get the user and return it with status 200 ... 
}); 

但是,如前所述,第一次測試成功,而第二次測試超時。

更新1: 此外,我得到了以下的輸出:

GET /api/v1/user/123 200 2.905 ms - 274 
GET /api/v1/user/ - - ms - - 

更新2: 所以添加以下代碼解決了這個問題,但並沒有真正解決問題:

app.get('/api/v1/user', function (req, res) { 
    return res.status(400).json('UserId expected'); 
}); 

顯然,我不想要一個相當冗餘的代碼片段。我很困惑,爲什麼我不能進入'api/v1/user /:userid'端點,只是在那裏測試:userid的存在?就好像nodejs需要存在:userid,否則端點不存在。它是否正確?

我錯過了什麼?

+0

如果服務器回來了什麼東西,你會不會?你可以在這兩個網站上添加一些console.log/breakpoints來查看它被粘貼的位置嗎?你怎麼知道你的第一個測試成功沒有斷言,或者你剛剛把它切斷? – Sprotte

+0

我在服務器和測試中都添加了console.log,我沒有收到服務器的響應。我認爲請求必須陷入服務器端,但我無法確定服務器端點的第一行有console.log,但它永遠不會被觸發。 – Ebbs

回答

0

所以我做了一些更多的調查,並要求對這個問題here另一個問題。

最後問題是我沒有完全理解表達框架。基本上我在我的問題的更新2中提到的路線是我需要遵循的路線,並且指定了一個路線,其中不需要參數,但返回我期望的錯誤消息。

我用這種方法的問題是,在某些情況下,你可能想要在你使用多個參數。但是,這將意味着爲滿足每個未定義參數的場景而設置的排列有點令人望而生畏。 (2個參數意味着4個組合,3個意味着9個等)。這將是一個維護噩夢!

從現在開始,我的做法是採用一種方法,讓任何想傳遞給服務器的信息通過每個請求的正文中的JSON發送。這將允許我保持一條路線。

0

根據mocha documentation必須始終調用完成的回調函數,以防出錯。實際上它接受一個錯誤。 所以我認爲你必須重寫代碼:

it('should return a 400 message if UserId is not supplied stating that "UserId expected"', function(done) { 
    request.get('http://localhost:8080/api/v1/user/', function (error, response, body) { 
     if (error) return done(error); 
     if (response.statusCode != 400) return done(new Error("Not 400")); 

     expect(body).to.be.equal('UserId expected'); 
     done(); 
    }); 
}); 
+0

你是對的,我按照你描述的方式重寫了它,我還在request.get中的回調中添加了console.log。但是,我從來沒有從這些console.log中得到結果,仍然只是超時。這使我相信有一些我不處理serverside,但我從來沒有從console.log得到響應,我把它放在端點的第一行.... – Ebbs