[英]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来模拟外部依赖项。
创建一个名为目录__mocks__
旁边node_modules
。
创建文件__mocks__/cassandra-driver.js
:
module.exports = {
types: {
consistencies: {
quorum: null
}
},
Client: jest.fn()
};
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
来监视对象的方法 - 在这里, driver
是createCassandraDriver
模块中的私有变量,因此我们不能使用它。
看起来您正在使用__set__
包? 如果是这样,我认为您应该能够通过使用jest.fn
来实现您想要的:
let createCassandraDriverSpy = jest.fn(clientMock);
createCassandraDriver.__set__('driver', createCassandraDriverSpy)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.