首页 > 解决方案 > JEST const 内的无效变量访问模拟

问题描述

经过大量研究后我问这个

我有这些文件

// connection.js
const mysql =  require('mysql');
module.exports = mysql.getConnection();
// a.js
const connection = require('./connection');
function doQuery() {
    const q = 'select * from table';
    connection.query(q, (err, res) => {
       ... do some stuff
    })
}
module.exports = doQuery;

当我用玩笑做一个测试时(删除不必要的东西以便更好地阅读)

// test.js
const jest = require('jest');
const a = require('./a.js');
const connection = {
  query: (query, cb) => cb('error', null),
};
jest.mock('./connection.js', () => connection);


test('testing something', () => {
    expect(a.doQuery).to.be.true //this is just an example
});

我收到下一个错误

The module factory of `jest.mock()` is not allowed to reference any out-of-scope variables.
    Invalid variable access: connection

我尝试移动同一个文件夹中的文件,有相对路径,绝对路径,移动导入的顺序,我真的搞不定。

我真的不知道如何解决这个问题,而且我正在从 proxyquire 迁移到 jest,这就是我这样做的原因,我不能再使用 proxyquire 了。

标签: jestjs

解决方案


是的,嗯......我会回答我自己的未来问题。

问题是你不能jest.mock()像我一样使用在函数外部声明的变量。

测试文件和模拟函数应该是这样的

解决方案 1

jest.mock('./connection.js', () => ({
  query: (query, cb) => cb('ee', null),
}));

看我没有在函数const connection...内使用任何变量()jest.mock

天空男孩

另外,感谢@skyboyer,我找到了另一个解决方案。

解决方案 2

使用jest.mock前缀之外的名称mock*

const mockConnection = {
    query: (query, cb) => cb('ee', null),
}
jest.mock('./connection.js', 

推荐阅读