Jest - макет требуемой функции модуля - PullRequest
0 голосов
/ 07 мая 2018

У меня есть следующий код, который мне нужно проверить: createCassandraDriver

const driver = require('cassandra-driver')
module.exports = ({
  cassandra_user,
  cassandra_password,
  cassandra_address
}) => {
  return new Promise((resolve, reject) => {
    try {
      const client = new driver.Client({
        contactPoints: cassandra_address.split(','),
        authProvider: authProvider(cassandra_user, cassandra_password),
        queryconfig: {
          consistency: driver.types.consistencies.quorum
        }
      })
      return resolve(client)
    } catch (e) {
      reject(e)
    }
  })
}

Я пытаюсь смоделировать вызов «driver.Client». Я попытался сделать это с помощью 'spyOn', например так:

'use strict';
const rewire = require('rewire'),
      driver = require('cassandra-driver'),
      createCassandraDriver = require('../../lib/createCassandraDriver.js');

const defaultArguments = () => {
  return {
    'cassandra_address': '127.0.0.1',
    'cassandra_user': 'cassandra_user',
    'cassandra_password': 'cassandra_password'
  };
}

jest.mock("cassandra-driver");

describe('Create cassandra driver tests', function () {
  describe('success flow', function () {
    it('Should pass without any errors ', async function () {    
        await createCassandraDriver(defaultArguments())
    });
  });
  afterEach(function () {
    jest.restoreAllMocks()
  });
});

__ mocks__ file

const driver = jest.genMockFromModule('cassandra-driver');
driver.Client = function () {return "cassandra_client"}    
module.exports = driver;

Но я получаю сообщение об ошибке, в котором говорится, что «драйвер не является функцией», и это правда.

Как я могу издеваться над вызовом «driver.Client» тогда? Пожалуйста, сообщите

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Я предлагаю использовать Ручные макеты для макетирования внешних зависимостей в ваших тестах Jest.

<Ч />
  1. Создайте каталог с именем __mocks__ рядом с node_modules.

  2. Создать файл __mocks__/cassandra-driver.js:

module.exports = {
  types: {
    consistencies: {
      quorum: null
    }
  },
  Client: jest.fn()
};
  1. Добавьте следующую строку в ваш тестовый файл:
jest.mock("cassandra-driver");
<Ч />

Теперь каждый раз, когда вы импортируете cassandra-driver в свой тест или в любые файлы, импортированные в ваш тест, вместо него будет импортирован модуль, реализованный на шаге 2.

Это позволяет вам вызывать driver.Client с любым из фиктивных методов для замены реализации, возвращаемого значения заглушки или доступа к экземплярам фиктивного доступа.

Вот полный пример теста:

import driver from "cassandra-driver";
import createCassandraDriver from "./createCassandraDriver";

jest.mock("cassandra-driver");

const clientStub = {
  foo: "bar"
};

driver.Client.mockImplementation(() => clientStub);

it("renders without crashing", async () => {
  const result = await createCassandraDriver({
    cassandra_user: "foo",
    cassandra_password: "bar",
    cassandra_address: "baz"
  });

  expect(result).toEqual(clientStub);
});
0 голосов
/ 07 мая 2018

Вы можете использовать jest.spyOn только для слежки за методом объекта - здесь driver является частной переменной в модуле createCassandraDriver, поэтому мы не можем использовать это.

Похоже, вы используете rewire package из-за использования __set__? Если это так, я думаю, вы сможете достичь того, чего хотите, используя jest.fn:

let createCassandraDriverSpy = jest.fn(clientMock);
createCassandraDriver.__set__('driver', createCassandraDriverSpy)
...