开玩笑地嘲笑 toHaveReturnedWith undefined
jest mocking toHaveReturnedWith undefined
我正在学习用笑话和特别是模拟模块进行单元测试。我用一些数学方法在 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 中,然后像这样进行模块模拟:
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 模拟函数似乎没有 return 任何值。我的问题是为什么?我做错了什么?
使用jest.mock('someModule')
后,jest将为这个模块创建一个auto-mocked版本。这意味着从这个模块导出的东西都是模拟的。
你可以认为模拟的math.add
方法是jest.fn()
。它没有模拟实现。如果没有给出实现,模拟函数将在调用时 return undefined
。这就是 math.add(1, 2)
returns undefined
.
的原因
您正在测试 math
模块,那么您不应该模拟它。但是如果你坚持要做。您可以在调用 math.add(1,2)
之前使用 math.add.mockReturnValue(3);
。但是没有意义,你可以给任何你想要的值。您没有测试真正的 math.add
方法。您只需将您的模拟 return 值与断言 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 Whosebug/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
我正在学习用笑话和特别是模拟模块进行单元测试。我用一些数学方法在 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 中,然后像这样进行模块模拟:
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 模拟函数似乎没有 return 任何值。我的问题是为什么?我做错了什么?
使用jest.mock('someModule')
后,jest将为这个模块创建一个auto-mocked版本。这意味着从这个模块导出的东西都是模拟的。
你可以认为模拟的math.add
方法是jest.fn()
。它没有模拟实现。如果没有给出实现,模拟函数将在调用时 return undefined
。这就是 math.add(1, 2)
returns undefined
.
您正在测试 math
模块,那么您不应该模拟它。但是如果你坚持要做。您可以在调用 math.add(1,2)
之前使用 math.add.mockReturnValue(3);
。但是没有意义,你可以给任何你想要的值。您没有测试真正的 math.add
方法。您只需将您的模拟 return 值与断言 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 Whosebug/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