繁体   English   中英

如何使用 Jest 模拟所需的模块功能?

[英]How to mock required module function with Jest?

我有以下代码需要测试:

创建Cassandra驱动程序

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()
  });
});

模拟文件

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

但是我收到一条错误消息,指出“驱动程序不是函数”,这是真的。

那么我如何模拟对'driver.Client'的调用?

我建议在 Jest 测试中使用Manual Mocks来模拟外部依赖项。


  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);
});

您只能使用jest.spyOn来监视对象的方法 - 在这里, drivercreateCassandraDriver模块中的私有变量,因此我们不能使用它。

看起来您正在使用__set__ 如果是这样,我认为您应该能够通过使用jest.fn来实现您想要的:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM