Как издеваться над pg Pool с Sinon - PullRequest
0 голосов
/ 26 февраля 2019

В предыдущем проекте я издевался над библиотекой mysql с Sinon .Я сделал это так:

X.js:

const con = mysql.createPool(config.mysql);
...

Some other place in the project:

const rows = await con.query(query, inserts);
...

X.test.js:

const sinon = require('sinon');
const mockMysql = sinon.mock(require('mysql'));
...

mockMysql.expects('createPool').returns({
        query: () => {
            // Handles the query...
        },
...

Отлично сработало.

В другом проекте я пытаюсь высмеять pg , опять же с Синоном.

pool.js:

const { Pool } = require('pg');
const config = require('@blabla/config');
const pool = new Pool(config.get('database'));

module.exports = pool;

Some other place in the project:

const con = await pool.connect();
const result = await con.query(...

Y.test.js:

???

Я не могу понятькак издеваться connect().query().Ни один из следующих подходов не работает:

1:

const { Pool } = require('pg');
const config = require('@blabla/config');

const mockPool = sinon.mock(new Pool(config.get('database')));
...
mockPool.expects('connect').returns({
  query: () => {
    console.log('query here');
  },
});

1 не приводит к ошибке, но используется реальное соединение БД.

2:

const { Pool } = sinon.mock(require('pg'));
const config = require('@blabla/config');

const pool = new Pool(config.get('database'));

pool.expects('connect').returns({
  query: () => {
    console.log('query here');
  },
}); 

2 => TypeError: Pool is not a constructor

3:

const { Pool } = sinon.mock(require('pg'));
const config = require('@blabla/config');

const pool = sinon.createStubInstance(Pool);
pool.connect.returns({
  query: () => {
    console.log('query here');
  },
});

3 => TypeError: The constructor should be a function.

Может кто-нибудь указать мне правильное направление, какиздеваться над моим соединением PostgreSQL?

1 Ответ

0 голосов
/ 26 февраля 2019

Поскольку вам нужно высмеивать возвращенные результаты запроса, я думаю, что самым простым решением было бы абстрагировать вашу базу данных от кода, требующего результатов запроса.Например, результаты вашего запроса возвращают информацию о человеке.Создайте модуль person.js с конкретными методами взаимодействия с базой данных.

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

//person.js
const { Pool } = require('pg)
// do other database connection things here
const getPersonById = function (id) {
  // use your query here and return the results
}
module.exports = { getPersonById }

Теперь в ваших тестах вы издеваетесь над личным модулем, а не модулем pg.Представьте, что если бы у вас было 20 нечетных тестов, для которых у всех был установлен фиктивный пул mysql, то вы переключились на pg, вам пришлось бы поменять все из них, кошмар.Но абстрагируя тип / настройку соединения с базой данных, это значительно упрощает тестирование, потому что теперь вам просто нужно заглушить / смоделировать ваш модуль person.js.

const person = require('../person.js') //or whatever relative file path it's in
const sinon = require('sinon')

describe('person.js', function () {
 it('is stubbed right now', function () {
  const personStub = sinon.stub(person)
  personStub.getPersonById.returns('yup')

  expect(personStub.getPersonById()).to.eq('yup')
 })
})
...