gpt4 book ai didi

javascript - Python 类 JavaScript 中的函数模拟

转载 作者:行者123 更新时间:2023-11-28 20:27:05 24 4
gpt4 key购买 nike

使用 Python 可以很容易地模拟在被测函数中使用的函数。

# my_module.py
def function_a():
return 'a'


def function_b():
return function_a() + 'b'



# tests/test_my_module.py
from unittest import TestCase
from unittest.mock import patch

from my_module import function_b


class MyModuleTestCase(TestCase):
@patch('my_module.function_a')
def test_function_b(self, mock_function_a):
mock_function_a.return_value = 'c'

self.assertEqual(function_b(), 'cb')

JavaScript 中是否可以使用 jest 之类的东西?

# myModule.js
function myFunctionA() {
return 'a';
}

export function myFunctionB() {
return myFunctionA() + 'b';
}



# __test__/test.myModule.js
import { myFunctionB } from '../myModule';

describe('myModule tests', () => {
test('myFunctionB works', () => {
// Mock `myFunctionA` return value here somehow.
expect(myFunctionB()).toBe('cb')
});
});

我读过 https://github.com/facebook/jest/issues/936仍然不知道该怎么做,因为有太多(hacky)建议(其中一些已有 2 年历史了)。

最佳答案

Jest 可以使用 jest.mock() 模拟整个模块或使用 jest.spyOn() 模拟单个模块导出结合 mockImplementation() 等功能.

这使得模拟从库中导入的函数变得容易:

// ---- lib.js ----
export function myFunctionA() {
return 'a';
}


// ---- myModule.js ----
import { myFunctionA } from './lib';

export function myFunctionB() {
return myFunctionA() + 'b'; // call lib.myFunctionA()
}


// ---- myModule.test.js ----
import { myFunctionB } from './myModule';
import * as lib from './lib';

describe('myModule tests', () => {
test('myFunctionB works', () => {
const mock = jest.spyOn(lib, 'myFunctionA'); // create a spy on lib.myFunctionA()
mock.mockImplementation(() => 'c'); // replace the implementation

expect(myFunctionB()).toBe('cb');

mock.mockRestore(); // remove the spy and mock implementation
});
});

在问题的代码示例中,myModule 包含两个函数,一个直接调用另一个。

因为 mock 对整个模块或模块导出起作用,所以从 myFunctionB() 中模拟对 myFunctionA() 的直接调用将非常困难代码写好了。

我发现解决这种情况的最简单方法是将模块导入自身并在调用函数时使用模块。这样它就是被调用的模块导出,它可以在测试中被模拟:

// ---- myModule.js ----
import * as myModule from './myModule';

export function myFunctionA() {
return 'a';
}

export function myFunctionB() {
return myModule.myFunctionA() + 'b'; // call myModule.myFunctionA()
}


// ---- myModule.test.js ----
import * as myModule from './myModule';

describe('myModule tests', () => {
test('myFunctionB works', () => {
const mock = jest.spyOn(myModule, 'myFunctionA'); // create a spy on myModule.myFunctionA()
mock.mockImplementation(() => 'c'); // replace the implementation

expect(myModule.myFunctionB()).toBe('cb');

mock.mockRestore(); // remove the spy and mock implementation
});
});

关于javascript - Python 类 JavaScript 中的函数模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52080459/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com