[英]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.