[英]Jest & Enzyme: Mocking a function (which contains xhr requests and also sets states) that resides inside of another function
[英]Mocking single function from a module which also calls it from another function, jest, typescript
我有两个功能的模块:
export const functionReturnsOne = () => {
return 1;
};
export const functionReturnsTwo = () => {
return functionReturnsOne() + functionReturnsOne();
};
现在我想模拟functionReturnsOne
但保留原始functionReturnsTwo
这是测试:
import { functionReturnsTwo, functionReturnsOne } from '../testModule';
jest.mock('../testModule', () => {
const actualTestModule = jest.requireActual('../testModule');
return {
...actualTestModule,
functionReturnsOne: jest.fn()
};
});
describe('testModule', () => {
test('when functionReturnsOne is mocked but functionReturnsTwo is not', () => {
const mockFunctionReturnsOne = functionReturnsOne as jest.Mock;
mockFunctionReturnsOne.mockReturnValue(13);
const result1 = functionReturnsOne();
const result2 = functionReturnsTwo();
expect(result1).toBe(13);
expect(result2).toBe(26);
});
});
运行测试后, result1
包含预期的13
,因此functionReturnsOne
的模拟有效。 但是result2
包含2
,这意味着这个 function 称为functionReturnsOne
的非模拟版本。
是否有优雅的方式(不拆分为单独的文件并且没有依赖注入)来调用原始functionReturnsTwo
来调用functionReturnsOne
的模拟版本?
根据此评论中提供的建议,以下内容对我有用:
import * as testModule from "../testModule";
describe('test spyon with function expressions', function () {
test('when there is no mock', () => {
jest.spyOn(testModule, 'functionReturnsOne').mockReturnValue(13);
const result1 = testModule.functionReturnsOne();
const result2 = testModule.functionReturnsTwo();
expect(result1).toBe(13);
expect(result2).toBe(26);
});
});
package.json(按要求)
{
"name": "cookbook",
"version": "1.0.0",
"description": "A simple recipe app using typescript and sequelize",
"main": "dist/index.js",
"scripts": {
"test": "jest",
"dev": "nodemon src/index.ts",
"build": "npx tsc"
},
"keywords": [
"sequelize",
"typescript",
"food",
"recipes",
"cache",
"speed",
"microdiff"
],
"author": "ibywaks",
"license": "ISC",
"dependencies": {
"dotenv": "^10.0.0",
"express": "^4.17.1",
"lodash": "^4.17.21",
"microdiff": "^1.3.0",
"mysql2": "^2.2.5",
"node-cache": "^5.1.2",
"sequelize": "^6.6.4"
},
"devDependencies": {
"@types/express": "^4.17.12",
"@types/jest": "^27.0.2",
"@types/lodash": "^4.14.171",
"@types/node": "^15.12.4",
"@types/node-cache": "^4.2.5",
"@types/supertest": "^2.0.11",
"eslint": "^7.30.0",
"jest": "^27.2.4",
"nodemon": "^2.0.7",
"supertest": "^6.1.6",
"ts-jest": "^27.0.5",
"ts-node": "^10.0.0",
"typescript": "^4.3.4"
}
}
由于您仅在 function 中返回模拟值,因此原始 functionTwo 没有必要获得模拟输入。 试试这个来模拟 functionTwo 并获得所需的响应。
import { functionReturnsTwo, functionReturnsOne } from '../testModule';
jest.mock('../testModule', () => {
const actualTestModule = jest.requireActual('../testModule');
return {
...actualTestModule,
functionReturnsOne: jest.fn()
};
});
describe('testModule', () => {
test('when there is no mock', () => {
const mockFunctionReturnsOne = functionReturnsOne as jest.Mock;
mockFunctionReturnsOne.mockReturnValue(13);
const mockFunctionReturnsTwo = functionReturnsTwo as jest.Mock;
mockFunctionReturnsTwo.mockReturnValue(functionReturnsOne() +
functionReturnsOne());
const result1 = functionReturnsOne();
const result2 = functionReturnsTwo();
expect(result1).toBe(13);
expect(result2).toBe(26);
});
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.