NodeJs / Koa-单元测试中未定义错误有效负载

时间:2018-10-05 12:07:30

标签: node.js mocha koa

我需要帮助弄清楚一些事情:我以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

1 个答案:

答案 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

即可解决问题

感谢:https://github.com/tgriesser/knex/issues/1855