开玩笑地嘲笑 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