如何在玩笑中仅模拟一个导出函数?

Pab*_*blo 3 javascript unit-testing jestjs

我试图在模块内的测试中模拟单个函数。这是我只需要模拟的模块generateServerSeed

// seeds.js
const crypto = require('crypto');

const generateServerSeed = function () {
    return crypto.randomBytes(4).toString('base64');
};

const hashServerSeed = function (serverSeed) {
    const hash = crypto.createHash('sha512');
    hash.update(serverSeed);
    return hash.digest('hex');
};

module.exports = {
    hashServerSeed,
    generateServerSeed
};
Run Code Online (Sandbox Code Playgroud)

这是使用该模块的函数:

// blabla.js
import { generateServerSeed, hashServerSeed } from './seeds';

const VeryImportantFunction = () => {
    const serverSeed = generateServerSeed();
    const hash = hashServerSeed(serverSeed);
    return hash;
};

module.exports = {
    VeryImportantFunction
};
Run Code Online (Sandbox Code Playgroud)

这是我的测试文件

jest.mock('../seeds');
import { VeryImportantFunction } from '../blabla';
import { generateServerSeed } from '../seeds';
const { hashServerSeed } = jest.requireActual('../seeds');

describe('Playground', function () {
    test('blabla', () => {
        generateServerSeed.mockReturnValue('1234567890ABCDEF');
        expect(VeryImportantFunction()).toBe('f456e02c19ac920...c630bd36cf04b4f57');
    });
});
Run Code Online (Sandbox Code Playgroud)

上面我尝试过模拟generateServerSeed,这是可以的。但我无法找到如何离开hashServerSeedusing的原始实现jest.requireActual,因为在测试函数本身中我没有显式调用该函数。

我怎样才能保留hashServerSeed原来的实现和模拟,generateServerSeed而不分离这两个函数,也不使用手动模拟来保持简单。

mga*_*cia 5

您确实可以模拟该方法并保留使用 jestgenerateServerSeed的所有原始剩余方法:seedsrequireActual

import { VeryImportantFunction } from '../blabla';
import { generateServerSeed } from '../seeds';

jest.mock('../seeds', () => {
    // The mock returned only mocks the generateServerSeed method.
    const actual = jest.requireActual('../seeds');

    return {
        ...actual,
        generateServerSeed: jest.fn()
    };
});

describe('Playground', function () {
    test('blabla', () => {
        // Mock the return value.
        generateServerSeed.mockReturnValue('1234567890ABCDEF');

        expect(VeryImportantFunction()).toBe('f456e02c19ac920...c630bd36cf04b4f57');
    });
});
Run Code Online (Sandbox Code Playgroud)