#node.js #mocking #chai #sinon #sinon-chai
Вопрос:
Я пишу единый модульный тест для метода, который требует подключения к базе данных. Я пытаюсь поиздеваться над этим с синон.поиздеваться, однако я получаю бросок:
TypeError: connection.query is not a function
Почему это происходит, разве mock не должен просто соответствовать моим условиям и выполнять функцию?
Мне все равно, что он вернет, мне просто важно, выполнит ли он sth.
Не могли бы вы, пожалуйста, рассказать мне, как правильно его реорганизовать?
Пока мне не нужен заглушка, я просто хочу проверить, как моя функция будет вести себя в разных условиях.
тестовый случай:
const sinon = require('sinon');
const chai = require('chai');
chai.use(require('sinon-chai'));
chai.use(require('chai-as-promised'));
const {Connection} = require('mysql');
...OTHER IMPORTS
describe('queries', () => {
let connectionMock;
before(() => {
connectionMock = sinon.mock(Connection);
});
describe('TEST CASE', () => {
const partialProp = {
id: 1,
date: '2019-08-23',
};
const accoId = 11;
it('TEST CASE v1', async () => {
const getSpy = sinon.spy(getAcco);
const prop = {...partialProp, accoId, cpId: null};
await getProp(prop, connectionMock);
chai.expect(getSpy).to.have.been.calledWith(prop, sinon.match.any);
});
});
});
Код для тестирования:
export const getProp = async (prop, connection) => {
if (prop.accoId !== null) {
const acco = await getAcco(prop.accoId!, connection); <-- this fails because uses connection.query from mysql
} else {
....
}
};
export const getAcco = async (id, connection) => {
return new Promise((resolve, reject) => {
connection.query(MY_QUERY_STRING, parameters, (err, result: any) => {
if (err) {
console.error('db error', err);
reject(new Error('Error communicating with database.'));
} else {
resolve(result);
}
});
});
}