Я пишу unit-тесты для простого приложения NodeJS и по какой-то причине я не могу получить тело ответа. Он получает правильный код ответа (либо 200 для успешных запросов, либо 422 для недопустимых), но тело кажется пустым. Кроме того, когда я делаю точно такой же запрос с httpie, он работает как шарм. Регистрация также показывает, что контроллер работает так, как ожидалось.node-fetch получает пустое тело
Любые идеи или предложения приветствуются.
Вот контроллер часть:
function register (req, res) {
return _findUser({email: req.body.email})
.then(user => {
if (user) {
console.log('EMAIL TAKEN');
return Promise.reject({message: 'This email is already taken'});
}
let params = _filterParams(req.body);
if (_isRegistrationValid(params)) {
console.log('REGISTRATION VALID');
return params;
} else {
console.log('PARAMS INVALID');
return Promise.reject({message: 'Params invalid'});
}
})
.then(_createUser)
.then(_generateToken)
.then(token => {
console.log('SENDING TOKEN');
console.log(token);
res.send({token: token});
})
.catch(error => {
console.log('CATCH ERROR');
res.status(422).send(error);
});
}
Вот секция теста:
it ('Returns token when data is valid', done => {
fetch(`http://localhost:${testPort}/api/register`, {
headers: {'Content-Type': 'application/json'},
method: 'POST',
body: JSON.stringify({email: '[email protected]', password: 'password', confirmPassword: 'password'})
})
.then(response => {
assert(response.ok); // this part works ok
expect(response.body.token).to.exist; // this part fails
done();
})
.catch(done);
});
Вот httpie выход:
kpr$ http post localhost:4000/api/register email="[email protected]" password="password" confirmPassword="password"
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 941
Content-Type: application/json; charset=utf-8
Date: Sat, 08 Oct 2016 11:39:30 GMT
ETag: W/"3ad-uBdW+HLbY7L2gb65Y+zptQ"
X-Powered-By: Express
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9_long_token_string_2M"
}
Вот тест выход:
REGISTRATION VALID
_createUser
(node:70495) DeprecationWarning: Mongoose: mpromise (mongoose's default promise library) is deprecated, plug in your own promise library instead: http://mongoosejs.com/docs/promises.html
_generateToken
SENDING TOKEN
eyJhbGciOiJIU_long_token_string_lmYA
0 passing (160ms)
2 pending
1 failing
1) Authorization Registration Returns token when data is valid:
AssertionError: expected undefined to exist
at fetch.then.response (test/auth-controller-spec.js:57:41)
at process._tickCallback (internal/process/next_tick.js:103:7)
Распечатка тела ответа изнутри выборки() показывает некоторый огромный объект:
PassThrough {
_readableState:
ReadableState {etc...}
}
Можете ли вы попробовать 'response.json()' вместо 'response.ok' ?? –
response.json() возвращает _Promise {} _ –
Konstantin
ОК, я думаю, это то, что мне было нужно: _response.json(). Then() _ возвращает то, что мне нужно. Спасибо большое, Дэвид! – Konstantin