簡體   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