Супертест ожидает неправильного утверждения кодов состояния

У меня есть тест, который выглядит так:

  it('should fail to get deleted customer', function(done) {
    request(app)
      .get('/customers/'+newCustomerId)
      .set('Authorization', 'Bearer ' + token)
      .set('Accept', 'application/json')
      .expect('Content-Type', /json/)
      .expect(404, done)
  });

Я прочитал документацию здесь:

https://github.com/visionmedia/supertest

В нем говорится следующее:

обратите внимание, как вы можете перейти сразу к любому из вызовов .expect()

Строка кода, которая не работает, это .expect(404, done), если я изменю ее на .expect(200, done), тогда тест не завершится ошибкой.

Однако, если я добавлю такой конец:

  it('should fail to get deleted customer', function(done) {
    request(app)
      .get('/customers/'+newCustomerId)
      .set('Authorization', 'Bearer ' + token)
      .set('Accept', 'application/json')
      .expect('Content-Type', /json/)
      .expect(200)
      .end(function(err, res) {
          if (err) console.log(err);
          done();
      });
  });

Тогда тест не проходит. Почему .expect(200, done) тоже не выходит из строя?


person SSH This    schedule 09.06.2016    source источник


Ответы (1)


Это ожидаемо, согласно документации. (https://github.com/visionmedia/supertest)

Если вы используете метод .end(), утверждения .expect(), которые потерпели неудачу, не будут генерироваться — они вернут утверждение как ошибку обратному вызову .end(). Чтобы не пройти тестовый пример, вам нужно будет повторно сгенерировать или передать err в done().

Когда вы делаете свои утверждения синхронно, вы обязаны обрабатывать ошибки вручную. В вашем первом фрагменте кода .expect(404, done) никогда не выполняется, потому что исключение было сгенерировано до того, как оно туда попало.

Ваш второй фрагмент не работает, как и ожидалось, потому что он может обработать ошибку. Поскольку ошибка была передана обработчику function(err, res) {}.

Я нахожу это громоздким и почти саморазрушительным, чтобы обрабатывать ошибки таким образом. Поэтому лучше использовать промисы, чтобы ошибки можно было обрабатывать автоматически следующим образом:

it('should fail to get deleted customer', function() {
  return request(app)
    .get('/customers/'+newCustomerId)
    .set('Authorization', 'Bearer ' + token)
    .set('Accept', 'application/json')
    .expect('Content-Type', /json/)
    .expect(200); 
});
person Lioness    schedule 20.04.2017
comment
Спасибо за ответ, это было изменение в версии 2.0.0: github. com/visionmedia/supertest/issues/ - person SSH This; 21.04.2017