Правильный ли подход для тестирования Nodejs API с использованием супертеста в нескольких файлах? - PullRequest
0 голосов
/ 27 февраля 2020

Я написал пару API-интерфейсов, для которых я хотел бы написать контрольные примеры, используя supertest. У меня есть два файла: index. js и tester. js.

index. js

import tester from './tester';

const supertest = require('supertest');
const randomString = require('randomstring');
const app = require('../../dist/server');

const request = supertest(app);


describe('User signup and login', () => {

  tester(request);

  it('Signup -> New user signup test', (done) => {
    request.post('/users')
      .send(`userName=test${randomString.generate(7)}&password=12345678&firstName=name&lastName=name`)
      .set('Accept', 'application/json')
      .expect('Content-Type', /json/)
      .expect(201)
      .end((err, res) => {
        if (err) {
          return done(err);
        }
        return done();
      });
  });
});

тестер. js

const randomString = require('randomstring');

export default function tester(request) {
  describe('testter ', () => {
    it('Signup -> New user signup test', (done) => {
      request.post('/users')
        .send(`userName=test${randomString.generate(7)}&password=12345678&firstName=nigilan&lastName=palladium`)
        .set('Accept', 'application/json')
        .expect('Content-Type', /json/)
        .expect(201)
        .end((err, res) => {
          if (err) {
            return done(err);
          }
          return done();
        });
    });
  });
}

Теперь, когда я запустите файл index. js, он запустит оба теста. Это правильный подход?

1 Ответ

1 голос
/ 27 февраля 2020

Тесты встраивания в функции

Я не понимаю цели tester.js. Это немного странная настройка. Но вы дважды написали один и тот же тест, и, вызвав функцию tester внутри блока describe, вы фактически поместите тест внутри этого блока. Я бы не советовал оборачивать тестовые блоки внутри таких функций, если только у вас нет веских причин для этого.

Использование супертеста

Я думаю, что супертест предназначен для инициализации в каждом тесте, т. е. поэтому вместо записи

const request = supertest(app);

describe('User signup and login', () => {
  it('Signup -> New user signup test', (done) => {
    request.post('/users')

напишите это:

describe('User signup and login', () => {
  it('Signup -> New user signup test', (done) => {
    const request = supertest(app);
    request.post('/users')

Это становится критически важным, если вам необходимо проверить некоторые функции cook ie с использованием фактического агента. В этом случае агент переносит файлы cookie во внутреннем состоянии, и вы, безусловно, не хотите, чтобы это состояние распределялось между тестами.

Пометка теста как завершенного

Функция готовности Мокко может быть передана непосредственно в expect, поэтому вместо записи:

.expect(201)
.end((err, res) => {
          if (err) {
            return done(err);
          }
          return done();
        });

Вы можете просто написать

.expect(201, done);

В качестве альтернативы, супертест может также использоваться как обещание, а mocha поддерживает обещания, так что вы можете написать

it("signup ...", () => {
    return request.post('/users') 
        ...
        .expect(201);
});

Так что это означает, что возвращаемое значение expect имеет функцию then. Будет ли функция вызываться на самом деле, будет определять, будет ли она вести себя как обещание или в «устаревшем» режиме. Если вы вернете обещание в тесте mocha, mocha позвонит then и будет использовано поведение обещания.

...