Издевательская сторонняя библиотека (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 ответ

Решение

У меня было несколько недоразумений / проблем с моим кодом, которые вызвали это. Возможно, это может просветить кого-то другого, спотыкающегося об этом;

  1. Мне требовалось "все" (import { MyLibrary } from "myLibrary") перед td.replace который произвел замену после того, как код потребовал модуль. Причина заключалась в том, что пример теста был спроектирован особым образом в репозитории стартового текста. Я сейчас сделал пиар, чтобы исправить основную проблему.
  2. Я проводил тесты 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" }));
Другие вопросы по тегам