Supertest + Tape + Restify - невозможно установить ошибку заголовков дважды при последовательных вызовах

Я строю API, используя Node.js и Restify. Я пытаюсь провести функциональное тестирование конечных точек с использованием Supertest и Tape. У меня есть тест, который делает два последовательных вызова API, и он говорит, что я не могу установить заголовки после их отправки.

UserController.js

/*
 * Create a user.
 */
exports.store = function(req, res, next) {
    // Get request input.
    var firstName = ParsesRequest.getValue(req, 'firstName'),
        lastName = ParsesRequest.getValue(req, 'lastName'),
        email = ParsesRequest.getValue(req, 'email'),
        password = ParsesRequest.getValue(req, 'password');

    // Create command.
    var command = new CreateUserCommand(firstName, lastName, email, password);

    // Execute command.
    CommandBus.execute(command, function(error, data) {
        var hasError = !!error && !data,
            status,
            message;

        status = (!hasError) ? StatusCodes.Created : StatusCodes.InternalServerError;
        message = (!hasError) ? UserTransformer.transform(data) : error;

        res.json(status, message);
    });
}

CreatesUserApiTest.js

var test            = require('tape');
var CreatesFakeUser = require('../../helpers/CreatesFakeUser'); 
var request         = require('supertest');
var config          = require('../../../config/Config').getConfiguration('test');
var url             = 'http://' + config.url + ':' + config.port;

test('Creates two users with same email and returns error', function(assert) {
    var user = CreatesFakeUser.generate();

    request(url)
        .post('/user')
        .set('Accept', 'application/json')
        .send(user)
        .expect(201)
        .end(function(err, res){
            assert.equals(res.status, 201, 'Returns 201 as status code.');
            assert.equals(!!res.body.id, true, 'Result body has an id field.');
        });

    request(url)
        .post('/user')
        .set('Accept', 'application/json')
        .send(user)
        .expect(500)
        .end(function(err, res){
            assert.equals(res.status, 500, 'Returns 500 because user already exists.');
            assert.end();
        });
});

У кого-нибудь есть идеи, почему второй запрос терпит неудачу? Я отправляю res.json только один раз в моем методе, поэтому не похоже, что он должен устанавливать заголовки дважды. Кроме того, я не уверен, имеет ли это какое-либо отношение к закрытию Соединения в заголовке, но я попытался, и это не помогает. Может быть, это как-то связано с асинхронностью.

Любая помощь будет оценена!

1 ответ

Решение

Я не могу сказать без дополнительного кода, но, возможно, во втором вызове есть обработчик ошибок, который возвращает что-то клиенту до вашего вызова res.json().

Например, вы настроили обработку InternalServerError при запуске вашего сервера?

Другие вопросы по тегам