Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

"fetch is not found globally and no fetcher passed" when using spacejam in meteor

I'm writing unit tests to check my api. Before I merged my git test branch with my dev branch everything was fine, but then I started to get this 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 });

Here's a part of my api.test.js file:

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');
    });
  });

The funniest thing is that I don't even have graphql in my tests (although, I use it in my meteor package) Unfortunately, I didn't to find enough information (apart from apollo-link-http docs that has examples, but still puzzles me). I did try to use that example, but it didn't help and I still get the same error

like image 885
Le garcon Avatar asked Jan 08 '18 16:01

Le garcon


2 Answers

I got the same error importing a npm module doing graphql queries into my React application. The app was compiling but tests were failing since window.fetch is not available in the Node.js runtime.

I solved the problem by installing node-fetch https://www.npmjs.com/package/node-fetch and adding the following declarations to 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: '' }

Doing so we instruct Jest on how to handle window.fetch when it executes frontend code in the Node.js runtime.

like image 83
RaymondMik Avatar answered Nov 08 '22 09:11

RaymondMik


If you're using nodejs do the following:

Install node-fetch

npm install --save node-fetch

Add the line below to index.js:

global.fetch = require('node-fetch');
like image 7
Brad Avatar answered Nov 08 '22 09:11

Brad