web-dev-qa-db-ja.com

流星でspacejamを使用すると、「フェッチがグローバルに検出されず、フェッチャーが渡されない」

私は私のAPIをチェックするユニットテストを書いています。私のgittestブランチを私のdevブランチとマージする前は、すべてうまくいっていましたが、これエラー

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

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

おもしろいことは、テストにgraphqlが含まれていないことです(ただし、meteorパッケージで使用しています)。残念ながら、十分な情報を見つけることができませんでした(- apollo-link-http docs これには例がありますが、それでも私を困惑させます)。私はその例を使用しようとしましたが、それは助けにはならず、それでも同じエラーが発生します

10
Le garcon

Reactアプリケーションにgraphqlクエリを実行するnpmモジュールをインポートすると、同じエラーが発生しました。アプリはコンパイルされましたが、window.fetchがNode.jsランタイムで使用できないため、テストは失敗しました。

node-fetchhttps://www.npmjs.com/package/node-fetch をインストールし、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: '' }

そうすることで、Node.jsランタイムでフロントエンドコードを実行するときにwindow.fetchを処理する方法をJestに指示します。

5
RaymondMik

Nodejsを使用している場合は、次のようにします。

インストールnode-fetch

npm install --save node-fetch

以下の行をindex.jsに追加します。

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

問題はこれです:fetchは、ブラウザーで定義され、fetch、またはwindow.fetch

サーバーでは定義されておらず、明示的にインポートするか、または https://www.npmjs.com/package/unfetch (エラーメッセージで提案されている)などのポリフィルを問題を解消するために、テストコードによってインポートされます。

3
Mikkel