сбрасывать базу данных перед каждым тестом

Я использую узел и супертест для простого приложения. Я получил SQlite3 для локальной тестовой базы данных. Я сделал простой тест, чтобы добавить super в базу данных. Я хотел сбрасывать базу данных каждый раз при запуске теста. Я ищу в документах прямо сейчас и не могу найти его. Я решил спросить здесь, потому что кажется, что кто-то, скорее всего, знает информацию.

const request = require('supertest');
const server = require('../server');

describe('Authentication', function() {

//database reset here

  it('should create a new user /users/registration', function(done) {
    request(server)
      .post('/users/register')
      .send({
        username: 'user-name',
        email: '[email protected]',
        password: '12345'
      })
      .set('Accept', 'application/json')
      .expect(201, done);
  });
});

person seattleguy    schedule 07.10.2019    source источник
comment
Правильный способ сделать это, вероятно, создать фиктивную конечную точку, которая на самом деле не читает вашу базу данных или не вставляет ее, просто возвращает фиксированные данные для выбора и true для вставок.   -  person Mrk Fldig    schedule 07.10.2019
comment
ты используешь шутку?   -  person Yousaf    schedule 07.10.2019
comment
да, я использую шутку   -  person seattleguy    schedule 07.10.2019
comment
В зависимости от того, на каком уровне вы пытаетесь протестировать, насмешка может быть или не быть правильным подходом. Если вы тестируете функциональность своих API, насмешки — это то, что вам нужно; если вы тестируете интеграцию между вашими API и базой данных, то подход OP - это то, что вам нужно.   -  person natn2323    schedule 07.10.2019


Ответы (4)


Если вы хотите запускать какой-либо фрагмент кода перед каждым тестом, вы можете использовать функцию beforeEach. в 1_

describe('my test', () => {
    beforeEach(() => {
       // code to run before each test
    });

    test('test 1', () => {
      // code
    });

   test('test 2', () => {
      // code
   });
});
person Yousaf    schedule 07.10.2019

Так что лучший способ сделать это - иметь некоторую логику в ваших функциях маршрутизации вашего API.

Receive an API request
Check if ['X-MOCK-HEADER'] exists
If it does then route to the mock version of the endpoint

Таким образом, ваш макет для создания пользователя всегда будет возвращать 201 OK - ваша конечная точка макета будет делать что-то вроде этого:

const routes = {
   CREATE_USER_OK:() => { return {....} } // make sure these return proper http responses
   CREATE_USER_BAD_REQUEST: () { return {...} }
}

 return routes[HEADER_VALUE]()

Причина в том, что вы тестируете маршрут, а не класс базы данных в этом экземпляре, поэтому вы просто хотите вернуть статические данные, если вы хотите протестировать что-то еще, просто измените значение X-MOCK-HEADER на то, что вы хотите, и добавьте макет маршрут, чтобы вернуть правильный HTTP-ответ/код — мне нужно знать, как выглядит код API, чтобы помочь вам в реализации бэкэнда.

Если возможно, держитесь подальше от промежуточных баз данных для тестирования, потому что в будущем вы будете терпеть МНОГО боли, поскольку она постепенно заполняется мусором.

Кроме того, если вы работаете с клиентским приложением, вы можете быстро создать прототип со статическими данными — это особенно полезно, если у вас есть клиентская команда, ожидающая, пока конечная точка API скажет создать экран входа в систему.

person Mrk Fldig    schedule 07.10.2019

Нет определенного способа сбросить базу данных sqlite, просто удалите базу данных и создайте заново.

Sqlite: как сбросить все таблицы базы данных?

person Sudhakar Ramasamy    schedule 07.10.2019
comment
Да, но если вы сделаете это, у вас будет код для удаления базы данных, которая будет работать в рабочей среде, поэтому, если кто-то сломает ее, ваши тесты могут стереть вашу рабочую базу данных. - person Mrk Fldig; 07.10.2019
comment
Извините, запустите prod и проверьте и env var, чтобы увидеть, является ли он промежуточным или производственным, поэтому, если проверка не работает, теоретически она может стереть базу данных prod! - person Mrk Fldig; 07.10.2019
comment
но если для env var установлено значение prod, то проверка не должна ломаться - person Sudhakar Ramasamy; 07.10.2019
comment
@Mrk Fldig Вы бы не стали запускать тесты в производстве. Вы бы развернули после тестирования, верно? - person Sudhakar Ramasamy; 07.10.2019
comment
Да, но ваши env vars перед развертыванием в prod обычно будут URL-адресами prod - person Mrk Fldig; 07.10.2019
comment
Вы правы с точки зрения очистки данных таблицы - я бы потел ночью, зная, что удаление/очистка всей таблицы предотвращается if(process.env....) - person Mrk Fldig; 07.10.2019
comment
Вы можете создать новую пустую базу данных и использовать - person Sudhakar Ramasamy; 07.10.2019
comment
не трогай prod db - person Sudhakar Ramasamy; 07.10.2019
comment
Да, я имею в виду, если вы довольны этим, это во многом зависит от вашего проекта, размера команды и т. д.! Меня лично это напугало бы до мурашек. - person Mrk Fldig; 07.10.2019
comment
вы хотите сбросить базу данных перед каждым тестом, поэтому с точки зрения пространства наличие пустой базы данных не окажет никакого влияния - person Sudhakar Ramasamy; 07.10.2019

Я сделал это в файле, и он отлично работает

const request = require('supertest');
const server = require('../server');
const knex = require('knex');
const dbConfig = require('../knexfile.js')['test'];
const db = knex(dbConfig);

describe('Authentication', () => {
  beforeEach(async () => {
    await db('users').truncate();
  });

  it('should create a new user /users/registration', function(done) {
    request(server)
      .post('/users/register')
      .send({
        username: 'user-name',
        email: '[email protected]',
        password: '12345'
      })
      .set('Accept', 'application/json')
      .expect(201, done);
  });
});
person seattleguy    schedule 07.10.2019