Издевательская сторонняя библиотека (ioredis) в тестах машинописи
У меня на удивление трудные времена, когда я могу смоделировать стороннюю библиотеку в моих тестах машинописи.
Я делаю библиотеку на основе этой библиотеки машинописи. Он использует AVA для тестирования.
В моем случае я пытаюсь издеваться над основным классом ioredis
так что мои тесты не пытаются установить реальные соединения с базой данных.
Я пытался использовать sinon, testdouble.js и издевательства.
В Sinon я попробовал следующее
let redisStub = sinon.stub(IORedis)
sinon.assert.called(redisStub.Cluster)
С testdouble я перепробовал множество вещей, в том числе;
td.replace('ioredis') // #1
td.replace('./homeMadeIoredisWrapperClass') // #2
Я пробовал издевательство
mockery.enable()
mockery.registerMock('ioredis', {some: 'object'})
Я также попробовал множество других вариантов, как всегда, используя require('ioredis')
в методах
Я пытаюсь сделать что-то невозможное здесь? Я думал, что заглушка / насмешка над базой данных - это нормальное явление, но я не могу этого понять.
Может быть, мой дизайн имеет недостатки, и я, возможно, пытаюсь высмеивать не те вещи? Некоторая помощь будет высоко ценится!
Ps. В случае, если это имеет значение, я пытаюсь создать довольно простую оболочку подключения ioredis.
1 ответ
У меня было несколько недоразумений / проблем с моим кодом, которые вызвали это. Возможно, это может просветить кого-то другого, спотыкающегося об этом;
- Мне требовалось "все" (
import { MyLibrary } from "myLibrary"
) передtd.replace
который произвел замену после того, как код потребовал модуль. Причина заключалась в том, что пример теста был спроектирован особым образом в репозитории стартового текста. Я сейчас сделал пиар, чтобы исправить основную проблему. - Я проводил тесты AVA параллельно, что вызвало
td.reset()
произойти до того, как некоторые из моих обратных вызовов сработали, эффективно предотвращаяreplace
работать во многих случаях. Решение в ava, используйтеtest.serial(...
вместоtest(...
, Да, тест будет работать медленнее, но они будут работать. Вы можете сделать отдельный файл для каждого теста, чтобы получить истинные параллельные прогоны в ava.
Есть также несколько полезных вики-записей на странице testdouble GitHub; https://github.com/testdouble/contributing-tests/wiki/Don%27t-mock-what-you-don%27t-own https://github.com/testdouble/contributing-tests/wiki/SAFE-test
Надеюсь, кто-то найдет это полезным.
Вы можете издеваться над ioredis (версия 4.16.2) с помощью только sinon. Вы должны издеваться над методом подключения.
import ioredis from "ioredis";
sinon.stub(ioredis.prototype, "connect").returns(Promise.resolve());
sinon.stub(ioredis.prototype, "get").returns(Promise.resolve({ data: "hello" }));