ava js 测试 GET returns 代码 204 POSTMAN GET returns 200

ava js test GET returns code 204 POSTMAN GET returns 200

我使用 koa js 2 和 postgres 数据库制作了一些 REST API 端点。

我有一个 setup/teardown 程序,它在 运行 进行任何测试之前 creates/drops 一个 postgres 数据库目录(例如 test_db)。 (我使用 npm script 'pretest' 挂钩来进行数据库设置,并使用 'posttest' 来进行数据库拆解)。

当我 运行 ava js 测试时,我有:

2 POST 测试(插入 2 行)- 这些都通过
1 GET 测试(例如获取 /users/1)- 失败:响应代码是 204 而不是 200
1 PUT 测试(例如 POST /users/:id)- 失败:响应代码是 204 而不是 200 。

我可以 运行 这些针对我的开发配置的测试,它们 所有 通过

不明白POST怎么能成功(插入一行到table)然后GET刚插入的行returns 204(无数据) .

目前测试数据库没有拆解,所以我可以查看测试数据库内部并验证 POSTS 是否成功,行插入了正确的 ID 值(如预期)。 (例如,我可以看到 id==1 的用户和 id==2 的用户)因此在执行测试时调用端点 /users/1 或 /users/2 应该会成功。

如果我使用测试数据库启动我的服务器,并且 运行 POSTMAN 针对这些端点和测试数据库,一切正常(例如 GET /users/1 returns正确 GET /users/2) 我得到 json 返回的代码是 200 而不是 204.

我不明白为什么我的 ava 测试在对 POSTMAN returns 代码 200 和有效 json 响应进行相同调用时会得到代码 204。

有什么可能导致这种情况的想法吗?

找到解决方案 - 我没有使用种子数据为数据库播种,并且由于 ava js 测试的并行性质,它们没有按顺序发生。

例如:我发生了 2 POST,然后是 GET(从上到下)

所以有两种解决方法:

  1. 带有数据的种子数据库作为预测试设置程序的一部分(DML 脚本)

  1. 在第一个 POST 测试之前放置一个 .before 以强制 POST 出现在 GET
  2. 之前

test.before('POST user (CREATE)', async t => {

而不是

test('POST user (CREATE)', async t => {

然后

test('GET single user', async t => { t.plan(3)

const res = await request(makeApp()) .get('/users/1')

然后你知道你的 GET :id 会成功(因为 POST 将强制发生在 GET /users/:id(或 GET /users/1)

之前

正如 ava js 文档所说:

"同时进行测试 运行 迫使您编写原子测试意味着测试不不依赖于全局状态或其他测试的状态,这是一件好事!"

希望这对未来的用户有所帮助!