私は私のAPIをチェックするユニットテストを書いています。私のgit
testブランチを私の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 これには例がありますが、それでも私を困惑させます)。私はその例を使用しようとしましたが、それは助けにはならず、それでも同じエラーが発生します
Reactアプリケーションにgraphqlクエリを実行するnpmモジュールをインポートすると、同じエラーが発生しました。アプリはコンパイルされましたが、window.fetch
がNode.jsランタイムで使用できないため、テストは失敗しました。
node-fetch
https://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に指示します。
Nodejsを使用している場合は、次のようにします。
インストールnode-fetch
npm install --save node-fetch
以下の行をindex.js
に追加します。
global.fetch = require('node-fetch');
問題はこれです:fetch
は、ブラウザーで定義され、fetch
、またはwindow.fetch
サーバーでは定義されておらず、明示的にインポートするか、または https://www.npmjs.com/package/unfetch (エラーメッセージで提案されている)などのポリフィルを問題を解消するために、テストコードによってインポートされます。