web-dev-qa-db-fra.com

"fetch n'est pas trouvé globalement et aucun récupérateur n'a été passé" lors de l'utilisation de spacejam dans météore

J'écris des tests unitaires pour vérifier mon api. Avant de fusionner ma branche gittest avec ma branche dev, tout allait bien, mais j'ai commencé à obtenir ceci error:

App running at: http://localhost:4096/
spacejam: meteor is ready
spacejam: spawning phantomjs
phantomjs: Running tests at http://localhost:4096/local using test-in-console
phantomjs: Error: fetch is not found globally and no fetcher passed, to fix pass a fetch for
  your environment like https://www.npmjs.com/package/unfetch.

  For example:
    import fetch from 'unfetch';
    import { createHttpLink } from 'apollo-link-http';

    const link = createHttpLink({ uri: '/graphql', fetch: fetch });

Voici une partie de mon fichier api.test.js:

describe('GraphQL API for users', () => {
    before(() => {
      StubCollections.add([Meteor.users]);
      StubCollections.stub();
    });

    after(() => {
      StubCollections.restore();
    });

    it('should do the work', () => {
      const x = 'hello';
      expect(x).to.be.a('string');
    });
  });

Le plus drôle est que je n'ai même pas graphql dans mes tests (bien que je l'utilise dans mon paquet meteor) Malheureusement, je n'ai pas trouvé suffisamment d'informations (à part apollo-link-http docs qui a des exemples, mais me laisse toujours perplexe). J'ai essayé d'utiliser cet exemple, mais cela n'a pas aidé et j'ai toujours la même erreur

5
Ivan P

Le problème est le suivant: fetch est défini lorsque vous êtes dans le navigateur et est disponible sous la forme fetch, voire window.fetch.

Sur le serveur, il n'est pas défini et doit être importé explicitement, ou un polyfill tel que https://www.npmjs.com/package/unfetch (comme suggéré dans le message d'erreur) doit être importé par votre code de test pour résoudre le problème.

2
Mikkel

J'ai eu la même erreur lors de l'importation d'un module npm effectuant des requêtes graphql dans mon application React. L'application compilait, mais les tests échouaient, car window.fetch n'était pas disponible dans le moteur d'exécution Node.js.

J'ai résolu le problème en installant node-fetchhttps://www.npmjs.com/package/node-fetch et en ajoutant les déclarations suivantes à jest.config.js:

const fetch = require('node-fetch')

global.fetch = fetch
global.window = global
global.Headers = fetch.Headers
global.Request = fetch.Request
global.Response = fetch.Response
global.location = { hostname: '' }

Ce faisant, nous expliquons à Jest comment manipuler window.fetch lorsqu’il exécute le code frontal dans le moteur d’exécution Node.js.

0
RaymondMik

Si vous utilisez nodejs, procédez comme suit: 

Installer node-fetch

npm install --save node-fetch

Ajoutez la ligne ci-dessous à index.js

global.fetch = require('node-fetch');
0
Brad