1

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

我有一个 setup/teardown 程序,它在运行任何测试之前创建/删除 postgres 数据库目录(例如 test_db)。(我使用 npm script 'pretest' hook 来做 db setup 和 'posttest' 来做 db teardown)。

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

2 个 POST 测试(插入 2 行)- 这两个都通过
1 个 GET 测试(例如 get /users/1)- FAIL:响应代码是 204 而不是 200
1 个 PUT 测试(例如 POST /users/:id)- FAIL:响应代码是 204 而不是 200 。

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

我不明白 POST 如何成功(将一行插入到表中),然后刚刚插入的行的 GET 返回 204(无数据)。

目前没有发生测试数据库拆卸,所以我可以查看测试数据库并验证 POSTS 确实成功,插入的行具有正确的 ID 值(如预期的那样)。(例如,我可以看到一个 id==1 的用户和一个 id==2 的用户)所以在执行测试时调用端点 /users/1 或 /users/2 应该会成功。

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

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

关于可能导致这种情况的任何想法?

4

1 回答 1

1

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

例如:我有 2 个 POST,然后是 GET(从上到下)

所以有两种解决方案:

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

或者

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

测试。before ('POST user (CREATE)', async t => {

代替

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

接着

test('GET 单用户', async t => { t.plan(3)

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

那么你知道你的 GET :id 会成功(因为 POST 将被迫在 GET /users/:id (或 GET /users/1)之前发生

正如 ava js 文档所说:

让测试同时运行 迫使你编写原子测试这意味着测试不依赖于全局状态或其他测试的状态,这是一件很棒的事情!

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

于 2017-03-30T21:52:21.890 回答