2016-01-27 3 views
-1

Я занимаюсь созданием функциональных тестов для существующего nodejs api, который я написал. Я использую mocha и expect.js.Тестирование Node.js api с mocha

Один тест, который терпит неудачу, - это когда я хочу сделать отрицательный тест на наличие параметра url. Я хочу отправить сообщение обратно потребителю услуги, если параметр отсутствует.

В настоящее время положительный тест у меня есть работы:

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

Однако, как указано ранее, первое испытание является успешным, в то время как второе время проверки ,

Update 1: Кроме того, я получаю следующий результат:

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

Update 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

Вы правы, и я переписал его так, как вы описали, также я добавил console.log внутри обратного вызова в request.get. Тем не менее, я никогда не получаю результат от тех console.log, все равно только тайм-аут. Это заставляет меня поверить, что есть что-то, что я не обрабатываю serveride, но я никогда не получаю ответа от console.log, который я вставлял в первую строку конечной точки .... – Ebbs

Смежные вопросы