Jest Spy не работает в другом каталоге? - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь создать несколько простых модульных тестов для небольшого сервиса, выполняющего веб-запросы, и мне очень трудно заставить шпионов Jest работать должным образом. Я обнаружил, что функциональность jest.spyOn будет работать, но это зависит от того, где именно находится тестовый файл, что не имеет смысла для меня. Итак, у меня есть что-то вроде этого:

src / getTimetableEventsAsyn c. js

const getTimetableEventsAsync = async (timetableSecrets, preferredUsername) => {
    console.log(got.get.toString());

    return got.get("someURL").json();

src / getTimetableEventsAsyn c. unit.test. js (это работает)

const got = require('got');
const { getTimetableEventsAsync } = require('./getTimetableEventsAsync');

describe('getTimetableEvents', () => {
    it('Tests the mock', async () => {
        jest.spyOn(got, 'get').mockImplementation(() => {
            console.log('foo');
        });

        await getTimetableEventsAsync('', '');
    });
});

tests / getTimetableEventsAsyn c .unit.test. js (это не работает)

const got = require('got');
const { getTimetableEventsAsync } = require('../src/getTimetableEventsAsync');

describe('getTimetableEvents', () => {
    it('Tests the mock', async () => {
        jest.spyOn(got, 'get').mockImplementation(() => {
            console.log('foo');
        });

        await getTimetableEventsAsync('', '');
    });
});

Меня смущает то, что два тестовых файла ведут себя по-разному. Журнал, который работает:

console.log src/getTimetableEventsAsync.js:11
     function mockConstructor() {
             return fn.apply(this, arguments);
           }
   console.log src/mocks.unit.test.js:7
     foo

Журнал, который не работает:

console.log src/getTimetableEventsAsync.js:11
      (url, options) => got(url, { ...options, method })

Так что, очевидно, jest.spyOn не работает, когда мой тестовый файл находится внутри моего Каталог tests, но тот же код работает в моем каталоге src нормально. Jest всегда запускается на root, и я могу запустить эти тесты в одном и том же тесте с разными результатами.

Может кто-нибудь сказать мне, что мне здесь не хватает? Почему я не могу запустить свои тесты в каталоге tests? В идеале, я бы хотел, чтобы они работали здесь, так как эти файлы намного проще исключить из любых развертываний и т. Д. c.

Так что проверка в tests / gettimetableEventsAsyn c .unit.test. js, чтобы убедиться, что шпион сработал, показывает, что локально в тесте он работает нормально, несмотря на то, что сразу после несоответствия.

 console.log tests/getTimetableEventsAsync.unit.test.js:10
      function mockConstructor() {
              return fn.apply(this, arguments);
            }

   console.log src/getTimetableEventsAsync.js:11
      (url, options) => got(url, { ...options, method })

1 Ответ

1 голос
/ 21 апреля 2020

Обычная причина, по которой шпион не должен быть установлен, когда он установлен, состоит в том, что он установлен на неправильном объекте. Если это происходит для импортированных пакетов, это часто означает, что пакеты были продублированы в иерархии node_modules.

В этом случае got в src / getTimetableEventsAsyn c. js is не тот же объект, что и got в tests / getTimetableEventsAsyn c .unit.test. js. Как оказалось, в src есть вложенный проект, который имеет собственный node_modules.

. Решение состоит в том, чтобы либо имитировать правильный got объект в тестах:

const got = require('../src/node_modules/got');
...
jest.spyOn(got, 'get').mockImplementation(() => {...});

, либо дедуплицировать пакеты, например, удалить вложенный проект в src или удалить из него дублирующиеся зависимости, например got, поэтому require('got') в src будет импортировать пакеты из root node_modules.

...