JEST Недопустимый макет доступа к переменной внутри const - PullRequest
0 голосов
/ 15 апреля 2020

Я спрашиваю об этом после долгих исследований

У меня есть эти файлы

// 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

Я пытался переместить файлы в той же папке, с относительными путями, абсолютными путями, перемещением порядка импорта, и я действительно не могу получить это.

Я действительно не знаю, как это исправить, также я перехожу с прокси-сервера на шутку, поэтому я делаю это и не могу использовать проксиквайр больше.

1 Ответ

0 голосов
/ 16 апреля 2020

Да, хорошо ... Собираюсь ответить на мой собственный вопрос на будущее.

Дело в том, что вы не можете использовать переменные, которые объявлены вне функции jest.mock(), как я делаю.

Файл теста и функция макета должны быть примерно такими:

Решение 1

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

Смотри, я не использую никаких переменных (const connection...) внутри функции jest.mock

skyboyer

Кроме того, я нашел другое решение благодаря @ skyboyer.

Solution 2

Используйте имена вне jest.mock с префиксом mock*

const mockConnection = {
    query: (query, cb) => cb('ee', null),
}
jest.mock('./connection.js', 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...