Jest с ошибкой генерации fetch-mock: TypeError: Невозможно прочитать свойство 'prototype' undefined при использовании на nodejs - PullRequest
0 голосов
/ 02 января 2019

Я почти уверен, что это моя ошибка, но я потратил целый день, пытаясь ее решить, и мне не удалось ?.

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

https://user -images.githubusercontent.com / 824198 / 50566568-7b49e400-0d22-11e9-884f-89720899de3a.png

Я уверен, что мой макет работает, потому что, если я передаю его через параметр в «Myclass.query», он отлично работает.

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

Но ... все вместе не работают ?.

Я создал очень простой и небольшой проект, чтобы увидеть, как эта проблема происходит:

https://github.com/cesarjr/test-node-fetch

Кто-нибудь может мне помочь?

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Я сейчас нашел надежный способ сочетать fetch-mock и jest http://www.wheresrhys.co.uk/fetch-mock/#usageusage-with-jest

0 голосов
/ 03 января 2019

Jest использует макет в __mocks__/node-fetch.js в любое время node-fetch требуется во время теста.

Проблема в том, что первое, что fetch-mock делает, требует node-fetch.

Это означает, что Request не определен, когда он установлен на config здесь , поэтому вызов prototype для неопределенного Request вызывает ошибку здесь .

Кто-то умнее меня может знать, как заставить Jest требовать фактического node-fetch, когда fetch-mock требует node-fetch в макете для node-fetch, но из того, что я вижу, это не похоже это возможно.


Похоже, вам придется удалить макет на __mocks__/node-fetch.js и передать fetch вашему коду, что-то вроде этого:

myclass.js

class MyClass {
  static query(fetch, sessionId, query) {
    const url = 'https://api.foobar.com';

    const body = {
      sessionId,
      query
    };

    return fetch(url, {
      method: 'post',
      body: JSON.stringify(body)
    })
      .then(res => res.json());
  }
}

module.exports = MyClass;

... затем создайте sandbox в своем тесте и передайте его в свой код, что-то вроде этого:

myclass.test.js

const fetch = require('fetch-mock').sandbox();
const MyClass = require('./myclass');

describe('MyClass', () => {
  describe('.query', () => {
    it('returns the response', () => {
      fetch.mock('*', {'result': {'fulfillment': {'speech': 'The answer'}}});

      expect.assertions(1);

      return MyClass.query(fetch, '123', 'the question').then((data) => {
        expect(data.result.fulfillment.speech).toBe('The answer');  // SUCCESS
      });
    });
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...