Мне нужна помощь, чтобы выяснить кое-что: я использую https://github.com/mjhea0/node-koa-api в качестве основы для разработки моего API.
В файле routs / movies.js вы можете видеть, что он использует:
router.get(`${BASE_URL}/:id`, async (ctx) => {
try {
const movie = await queries.getSingleMovie(ctx.params.id);
if (movie.length) {
ctx.body = {
status: 'success',
data: movie
};
} else {
ctx.status = 404;
ctx.body = {
status: 'error',
message: 'That movie does not exist.'
};
}
} catch (err) {
console.log(err)
}
})
Чтобы создать маршрут GET / movies / id и внутренние юнит-тесты:
describe('GET /api/v1/movies/:id', () => {
it('should throw an error if the movie does not exist', (done) => {
chai.request(server)
.get('/api/v1/movies/9999999')
.end((err, res) => {
// there should an error
should.exist(err);
// there should be a 404 status code
res.status.should.equal(404);
// the response should be JSON
res.type.should.equal('application/json');
// the JSON response body should have a
// key-value pair of {"status": "error"}
res.body.status.should.eql('error');
// the JSON response body should have a
// key-value pair of {"message": "That movie does not exist."}
res.body.message.should.eql('That movie does not exist.');
done();
});
});
});
Чтобы проверить неправильный идентификатор.
У меня точно такой же код в моемроутер, но для моей собственной сущности 'гильдии':
router.get('/api/v1/guilds/:id', async (ctx) => {
try {
const guild = await queries.getOneGuild(ctx.params.id);
if (guild.length) {
ctx.body = {
status: 'success',
data: guild,
};
} else {
ctx.status = 404;
ctx.body = {
status: 'error',
message: 'That guild does not exist.',
};
}
} catch (err) {
console.log(err);
}
});
А внутри моего tests / rout.guilds.test.js то же самое, что и для github repo:
describe('GET /api/v1/guilds/:id', () => {
it('should throw an error if the guild does not exist', (done) => {
chai.request(server)
.get('/api/v1/guilds/9999999')
.end((err, res) => {
console.log(err);
should.exist(err);
// there should be a 404 status code
res.status.should.equal(404);
// the response should be JSON
res.type.should.equal('application/json');
// the JSON response body should have a
// key-value pair of {"status": "error"}
res.body.status.should.eql('error');
// the JSON response body should have a
// key-value pair of {"message": "That guild does not exist."}
res.body.message.should.eql('That guild does not exist.');
done();
});
});
});
Myпроблема в том, что строка:
// there should an error
should.exist(err);
В указанном GitHub: err установлено значение, а в моем коде ошибка не определена ...
Я не понимаю, почему ссылкаКод GitHub как ошибка, установленная для большого массива данных в
.end((err, res) => {})
И мой даже не определен.Тем более, что я делаю то же самое ...
Это мой первый API Koa / Node.js, так что я мог что-то пропустить.
Заранее спасибо за любой вклад!
Редактировать: Забыл сказать это.
ctx.status = 404;
ctx.body = {
status: 'error',
message: 'Guild not found.'
};
на самом деле работает, и я могу увидеть их значения в модульных тестах Mocha:
.end((err, res) => {
console.log(res.status); // Prints 404
console.log(res.body.message); // Prints 'Guild not found'
});
Кажется, что Koa / Koa-router внутри репозитория Github, на который ссылаются, автоматически видит это как ошибкуи устанавливает что-то в то время как в моем коде это не ...
Редактировать 2: Поскольку дан первый ответ, я проверил удаление блока try catch внутри исходного кода GitHub, на который есть ссылка, и их модульный тествсе еще работает, поэтому он не имеет ничего общего с блоком try catch.
router.get(`${BASE_URL}/:id`, async (ctx) => {
const movie = await queries.getSingleMovie(ctx.params.id);
if (movie.length) {
ctx.body = {
status: 'success',
data: movie
};
} else {
ctx.status = 404;
ctx.body = {
status: 'error',
message: 'That movie does not exist.'
};
}
});
при том же поведении в отношении модульных тестов: Err все еще установлен внутри routes.movies.test.js