Supertest + Tape + Restify - 连续调用无法设置 headers 两次错误
Supertest + Tape + Restify - Can't set headers twice error on consecutive calls
我正在使用 Node.js 和 Restify 构建一个 API。我正在尝试使用 Supertest 和 Tape 进行功能端点测试。我有一个连续两次调用 API 的测试,它说我无法在 header 发送后设置它们。
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 一次,所以它似乎不应该设置 header 两次。另外,我不确定它是否与将 header 上的连接设置为关闭有任何关系,但我试过了但没有帮助。可能和async有关。
如有任何帮助,我们将不胜感激!
我不能说没有更多代码,但可能是在第二次调用时有一个错误处理程序在您调用 res.json() 之前将某些内容返回给客户端。
例如,您是否在服务器启动时设置了 InternalServerError 处理?
我正在使用 Node.js 和 Restify 构建一个 API。我正在尝试使用 Supertest 和 Tape 进行功能端点测试。我有一个连续两次调用 API 的测试,它说我无法在 header 发送后设置它们。
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 一次,所以它似乎不应该设置 header 两次。另外,我不确定它是否与将 header 上的连接设置为关闭有任何关系,但我试过了但没有帮助。可能和async有关。
如有任何帮助,我们将不胜感激!
我不能说没有更多代码,但可能是在第二次调用时有一个错误处理程序在您调用 res.json() 之前将某些内容返回给客户端。
例如,您是否在服务器启动时设置了 InternalServerError 处理?