我需要帮助弄清楚一些事情:我以https://github.com/mjhea0/node-koa-api为基础来开发我的API。
在routes / 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();
});
});
});
测试错误的ID。
我在路由器中具有完全相同的代码,但对于我自己的实体“行会”:
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 / routes.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();
});
});
});
我的问题是那条线:
// there should an error
should.exist(err);
在引用的GitHub中:err设置为一个值,而在我的代码中err未定义...
我不明白为什么引用的GitHub代码作为err设置了
中的大量数据.end((err, res) => {})
我的甚至都没有定义。特别是因为我做同样的事情...
这是我的第一个Koa / Node.js API,所以我可能刚刚错过了一些东西。
感谢您的任何输入!
编辑:忘记了。
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'
});
被引用的Github存储库中的Koa / Koa-router似乎自动将其视为错误并在我的代码中设置了某些内容而不是...
编辑2:由于给出了第一个答案,我测试了删除引用的GitHub源代码中的try catch块,并且它们的单元测试仍然有效,因此与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.'
};
}
});
与关于单元测试的行为相同:在routes.movies.test.js
内仍设置了Err
答案 0 :(得分:0)
我发现了问题,这个github仓库使用chai-http@3.0.0,而我使用的是chai-http@4.2.0
在chai-http@4.0.0中,如果请求成功,则删除了err参数。
仅保留chai-http@4.2.0并删除gem install sass-json-vars