использование функции asyn c await в утверждении Мокко с супертестом - PullRequest
1 голос
/ 29 февраля 2020

Я пытаюсь написать тесты для моего Node API с Mocha и Supertest.

Мне удалось использовать обещания с .then, но это быстро превратилось в ад "обратного вызова", который трудно поддерживать в долгосрочной перспективе.

// Success using `.then`
describe('/categories', () => {
  it('GET-/categories ,should contain 2 category documents after creating', done => {
    request(app)
      .post('/categories')
      .send({
        name: 'user1',
      })
      .then(res => {
        request(app)
          .post('/categories')
          .send({
            name: 'user2',
          })
          .then(res => {
            request(app)
              .get('/categories')
              .then(res => {
                const categories = res.body;
                expect(categories.length).to.equal(2);
                done();
              });
          });
      })
      .catch(err => done(err));
  });
});

Теперь я пытаюсь написать это с async await, но возвращает ошибку.

// DOES NOT WORK using `async`/`await`
describe('/categories', () => {
  it('GET-/categories ,should contain 2 category documents after creating', async done => {
    try {

      const category1 = await request(app)
        .post('/categories')
        .send({
          name: 'user2',
        });

      const category2 = await request(app)
        .post('/categories')
        .send({
          name: 'user2',
        });

      const categories = await request(app).get('/categories');
      const result = categories.body;
      expect(result.length).to.equal(2);
      done();

    } catch (e) {
      done(e);
    }
  });
});

Ошибка: метод разрешения слишком задан. Укажите обратный вызов или вернуть обещание; не оба.

При исследовании этой проблемы я обнаружил некоторые темы, которые рекомендовали пропустить done(), поэтому я сделал, но тест не работал должным образом. Они даже потерпели неудачу, утверждая, что получили пропуск.

// DOES NOT WORK using `async`/`await` without `done()`
describe('/categories', () => {
  it('GET-/categories ,should contain 2 category documents after creating', async () => {
    try {

      const category1 = await request(app)
        .post('/categories')
        .send({
          name: 'user2',
        });

      const category2 = await request(app)
        .post('/categories')
        .send({
          name: 'user2',
        });

      const categories = await request(app).get('/categories');
      const result = categories.body;
      expect(result.length).to.equal(2);

    } catch (e) {
      console.log(e);
    }
  });
});

1 Ответ

0 голосов
/ 29 февраля 2020

Хорошо, я нахожу ответ, во-первых, вы не должны передавать функцию обратного вызова done (), используя asyn c, а затем использование оператора try-catch мешает утверждению и не позволяет тесту работать естественным образом. вам, вероятно, лучше не помещать свои утверждения в простое утверждение!

it('GET-/categories ,should contain 2 category documents after creating',async()=>{
            const category1 = await  
            request(app).post('/categories')
            .send({
                name       :'user1'
            }); 
            const category2 = await
            request(app).post('/categories')
            .send({
            name       :'user2'
            })

            const result =await 
            request(app).get('/categories')
            .set('Content-Type', 'application/json')
            .set('Acccept', 'application/json')
            .catch(err => { 
                throw err; 
            })
            const categories= result.body;
            expect(categories.length).to.equal(2);

    })
...