Поскольку использование драйвера mysql требует, чтобы вы сначала создали соединение и использовали apis возвращаемого контроллера соединений - вам нужен двухэтапный подход.
Есть два способа сделать это.
заглушает createConnection и возвращает ему заглушенное соединение
Во время настройки:
const sinon = require('sinon');
const mysql = require('mysql');
const {createConnection} = mysql;
let mockConnection;
sinon.stub(mysql, 'createConnection').callsFake((...args) => {
mockConnection = sinon.stub(createConnection.apply(mysql, args))
.expects('query').withArgs(.... )//program it how you like :)
return mockConnection;
})
const mockConnectionFactory =
sinon.stub(mysql)
.expects('createConnection')
Во время разрыва:
mysql.createConnection.restore();
Обратите внимание, что здесь query
Метод проверяется на экземпляре и не влияет на базовый механизм, поэтому необходимо восстановить только createConnection
.
заглушить метод .query в прототипе соединения
Этот методнемного сложнее, потому что драйвер mysql
официально не раскрывает соединение для импорта.(ну, вы могли бы просто импортировать только модуль, реализующий соединение, но нет никакой гарантии, что какой-либо рефакторинг не будет его перемещать оттуда).Таким образом, чтобы получить ссылку на прототип - я обычно создаю соединение и просматриваю цепочку конструктор-прототип:
Я обычно делаю это в одну строку, но я разобью его на этапы и объяснюэто здесь:
Во время настройки:
const realConnection = mysql.createConnection({})
const mockTarget = realConnection.constructor.prototype;
//Then - brutally
consdt mock = sinon.mock(mockTarget).expect('query'....
//OR - as I prefer the surgical manner
sinon.stub(mockTarget, 'query').expect('query'....
Во время разрушения
//brutal
mock.restore()
// - OR - surgical:
mockTarget.query.restore()
Обратите внимание, что мы не высмеиваем здесь метод createConnection
.Все проверки параметров соединения все еще будут происходить (что я хочу, чтобы они происходили. Я стремлюсь работать с максимально аутентичными деталями - поэтому имитирую абсолютный минимум, необходимый для быстрого теста).Тем не менее - query
смоделирован на прототипе и должен быть восстановлен.
Также обратите внимание, что если вы работаете хирургическим путем, verify
будет по методу, а не по mockTarget.
Вот хороший ресурс об этом: http://devdocs.io/sinon~6-stubs/