繁体   English   中英

Mocking 来自一个模块的单个 function 也从另一个模块调用它 function,开玩笑,typescript

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

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