J'écris des tests unitaires pour vérifier mon api. Avant de fusionner ma branche git
test 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
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.
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-fetch
https://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.
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');