2016-10-08 9 views
0

Я пишу 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...} 
} 
+0

Можете ли вы попробовать 'response.json()' вместо 'response.ok' ?? –

+0

response.json() возвращает _Promise {} _ – Konstantin

+0

ОК, я думаю, это то, что мне было нужно: _response.json(). Then() _ возвращает то, что мне нужно. Спасибо большое, Дэвид! – Konstantin

ответ

1

Вам нужно попробовать response.json() вместо response.ok, который будет возвращать ответ в надлежащем порядке в вашем случае.

Надеюсь, это поможет!

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