Jest中对象的手动模拟

15

我正在尝试在Jest中理解手动模拟。我认为这应该很容易...但事实并非如此。

我的项目目录结构如下:

  • __tests__
    • user-test.js
  • models
    • user.js
    • __mocks__
      • user.js
  • node_modules
    • ...
  • package.json

models/user.js和models/__mocks__/user.js都有相同的代码:

module.exports = {
    create(username, password) {
        return new Promise(function(resolve, reject) {
            setTimeout(function() {
                resolve({"username":username, "password": password});
            }, 100);
        });
    }
}

文件__tests__/user-test.js看起来像这样:

test('user creation works', () => {
    const user = require('../models/user');
    //const user = jest.mock('../models/user');
    return user.create("mitchell", "boo");
});

这个代码可以正常工作,测试通过。但是当我把它改成以下代码时:

test('user creation works', () => {
    //const user = require('../models/user');
    const user = jest.mock('../models/user');
    return user.create("mitchell", "boo");
});

它无法工作,并且会输出:

 FAIL  __tests__\user-test.js
  ● user creation works

    TypeError: user.create is not a function

      at Object.<anonymous>.test (__tests__\user-test.js:4:17)
      at process._tickCallback (internal\process\next_tick.js:103:7)
1个回答

27
啊!我明白了!我的文件夹结构没问题。原来我对“jest.mock”的作用有误解。“jest.mock”改变了节点“require”函数的行为,以使用模拟程序,它本身并不执行要求操作。
我的测试应该像这样:
jest.mock('../models/user');
test('user creation works', () => {
    const user = require('../models/user');
    return user.create("mitchell", "boo");
});

Jest模拟用于防止在初始化模块或实例化对象时调用模块中的函数,这样做是为了提供良好的保护,以防止其他软件层被当前单元测试的目标攻击。 - kerolos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接