[英]jest mocking toHaveReturnedWith undefined
我正在用 jest 学习单元测试,尤其是 mocking 模块。 我用一些数学方法在 math.js 文件中写了一些简单的模块:
const add = (a, b) => a + b;
const subtract = (a, b) => b - a;
const multiply = (a, b) => a * b;
const divide = (a, b) => b / a;
module.exports = {
add,
subtract,
multiply,
divide
}
然后我将它包含在我的主要 js 中,然后像这样执行模块 mocking:
jest.mock('./math.js');
const math = require('./math');
test("calls math.add", () => {
math.add(1, 2);
console.log(math.add.mock);
expect(math.add).toHaveBeenCalled();
expect(math.add).toHaveBeenCalledWith(1, 2);
expect(math.add).toHaveReturned();
expect(math.add).toHaveReturnedWith(3);
});
现在,当我运行我的测试时,除了最后一个之外,所有测试都通过了:
expect(math.add).toHaveReturnedWith(3);
在控制台中我看到:
● 调用 math.add
expect(jest.fn()).toHaveReturnedWith(expected)
Expected: 3
Received: undefined
Number of returns: 1
10 | expect(math.add).toHaveBeenCalledWith(1, 2);
11 | expect(math.add).toHaveReturned();
> 12 | expect(math.add).toHaveReturnedWith(3);
| ^
13 | });
和 console.log(math.add.mock) 给了我这个:
console.log
{
calls: [ [ 1, 2 ] ],
instances: [
{
add: [Function],
subtract: [Function],
multiply: [Function],
divide: [Function]
}
],
invocationCallOrder: [ 1 ],
results: [ { type: 'return', value: undefined } ],
lastCall: [ 1, 2 ]
}
所以看起来 math.add mocked function 没有返回任何值。 我的问题是为什么? 我做错了什么?
在使用jest.mock('someModule')
之后,jest 将为此模块创建一个自动模拟版本。 这意味着从这个模块导出的东西都是模拟的。
您可以认为模拟的math.add
方法是jest.fn()
。 它没有模拟实现。 如果没有给出实现,模拟 function 将在调用时返回undefined
。 这就是math.add(1, 2)
返回undefined
的原因。
您正在测试math
模块,那么您不应该模拟它。 但如果你坚持要做。 你可以使用math.add.mockReturnValue(3);
在调用math.add(1,2)
之前。 但是没有意义,你可以给任何你想要的值。 您没有测试真正的math.add
方法。 您只需将模拟返回值与断言expect(math.add).toHaveReturnedWith(3)
例如math.js
:
const add = (a, b) => a + b;
const subtract = (a, b) => b - a;
const multiply = (a, b) => a * b;
const divide = (a, b) => b / a;
module.exports = {
add,
subtract,
multiply,
divide,
};
math.test.js
:
const math = require('./math');
jest.mock('./math.js');
test('calls math.add', () => {
math.add.mockReturnValue(3);
math.add(1, 2);
expect(jest.isMockFunction(math.add)).toBeTruthy();
expect(math.add).toHaveBeenCalled();
expect(math.add).toHaveBeenCalledWith(1, 2);
expect(math.add).toHaveReturned();
expect(math.add).toHaveReturnedWith(3);
});
测试结果:
PASS stackoverflow/71605818/math.test.js
✓ calls math.add (3 ms)
----------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
----------|---------|----------|---------|---------|-------------------
All files | 100 | 100 | 20 | 100 |
math.js | 100 | 100 | 20 | 100 |
----------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 1.225 s
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.