我在尝试用构造函数模拟模块时遇到麻烦
// code.js
const ServiceClass = require('service-library');
const serviceInstance = new ServiceClass('some param');
exports.myFunction = () => {
serviceInstance.doSomething();
};
和测试代码:
// code.test.js
const ServiceClass = require('service-library');
jest.mock('service-library');
const {myFunction} = require('../path/to/my/code');
test('check that the service does something', () => {
// ????
});
与文档示例Mocking Modules不同,因为您需要在导入模块后实例化该模块。而且与模拟功能都不一样。
在测试时如何模拟此doSomething()
函数?
作为参考,我试图在这里模拟@google-cloud/*
软件包。我有一些项目可以利用这一点。
答案 0 :(得分:3)
您需要首先模拟整个模块,以便返回一个笑话模拟。然后导入到您的测试中,并将模拟设置为一个函数,该函数返回一个持有doSomething
间谍的对象。对于测试,用new
调用的类与用new
调用的函数之间是有区别的。
import ServiceLibrary from 'service-library'
jest.mock( 'service-library', () => jest.fn())
const doSomething = jest.fn()
ServiceLibrary.mockImplementation(() => ({doSomething}))
答案 1 :(得分:0)
在@andreas-köberle解决方案之后,我能够像这样模拟@google-cloud/bigquery
:
// mock bigquery library
const BigQuery = require('@google-cloud/bigquery');
jest.mock('@google-cloud/bigquery', () => jest.fn());
const load = jest.fn(() => ({'@type': 'bigquery#load_job'}));
const table = jest.fn(() => ({load}));
const dataset = jest.fn(() => ({table}));
BigQuery.mockImplementation(() => ({dataset}));
// mock cloud storage library
const {Storage} = require('@google-cloud/storage');
jest.mock('@google-cloud/storage');
const file = jest.fn(name => ({'@type': 'storage#file', name}));
const bucket = jest.fn(() => ({file}));
Storage.mockImplementation(() => ({bucket}));
如果有人用谷歌搜索类似内容,我将在此留作参考。但要明确地说,这只是@andreas-köberle answer
的一种具体化