NodeJs / Koa - ошибка полезной нагрузки не определена в модульных тестах - PullRequest
0 голосов
/ 05 октября 2018

Мне нужна помощь, чтобы выяснить кое-что: я использую https://github.com/mjhea0/node-koa-api в качестве основы для разработки моего API.

В файле routs / 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();
    });
  });
});

Чтобы проверить неправильный идентификатор.

У меня точно такой же код в моемроутер, но для моей собственной сущности 'гильдии':

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 / rout.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();
     });
  });
});

Myпроблема в том, что строка:

// there should an error
should.exist(err);

В указанном GitHub: err установлено значение, а в моем коде ошибка не определена ...

Я не понимаю, почему ссылкаКод GitHub как ошибка, установленная для большого массива данных в

.end((err, res) => {})

И мой даже не определен.Тем более, что я делаю то же самое ...

Это мой первый API Koa / Node.js, так что я мог что-то пропустить.

Заранее спасибо за любой вклад!

Редактировать: Забыл сказать это.

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'
});

Кажется, что Koa / Koa-router внутри репозитория Github, на который ссылаются, автоматически видит это как ошибкуи устанавливает что-то в то время как в моем коде это не ...

Редактировать 2: Поскольку дан первый ответ, я проверил удаление блока try catch внутри исходного кода GitHub, на который есть ссылка, и их модульный тествсе еще работает, поэтому он не имеет ничего общего с блоком 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.'
     };
   }
});

при том же поведении в отношении модульных тестов: Err все еще установлен внутри routes.movies.test.js

1 Ответ

0 голосов
/ 05 октября 2018

Я обнаружил проблему, этот репозиторий github использует chai-http@3.0.0, и я использовал chai-http@4.2.0

в chai-http@4.0.0 они удалили аргумент err, еслизапрос выполнен успешно

Проблема была решена путем сохранения chai-http@4.2.0 и удаления should.exists(err)

Благодаря: https://github.com/tgriesser/knex/issues/1855

...