【问题标题】:ava js test GET returns code 204 POSTMAN GET returns 200ava js test GET 返回代码 204 POSTMAN GET 返回 200
【发布时间】:2017-03-29 21:35:09
【问题描述】:

我使用 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 测试(例如获取 /users/1) - 失败:响应代码是 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。

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

【问题讨论】:

    标签: postgresql npm postman ava koa2


    【解决方案1】:

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

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

    所以有两种解决方案:

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

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

    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 文档所说:

    "同时运行测试 强制您编写原子测试意味着测试不依赖于全局状态或其他测试的状态,即很棒的东西!

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-09
      • 2015-11-22
      • 1970-01-01
      • 1970-01-01
      • 2016-06-18
      • 1970-01-01
      • 2019-12-16
      • 1970-01-01
      相关资源
      最近更新 更多