我正在编写单元测试来检查我的api。在我将git
测试分支与我的 dev 分支合并之前,一切都很好,但后来我开始得到错误:< / p>
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之外有例子,但仍然让我感到困惑)。我确实尝试使用该示例,但它没有帮助,我仍然得到相同的错误
答案 0 :(得分:5)
我在导入一个执行graphql查询的npm模块到我的React应用程序中时遇到了同样的错误。该应用正在编译,但由于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: '' }
这样做是为了指导Jest在{.1}在Node.js运行时中执行前端代码时如何处理。
答案 1 :(得分:4)
如果您使用的是nodejs,请执行以下操作:
安装node-fetch
npm install --save node-fetch
将以下行添加到index.js
:
global.fetch = require('node-fetch');
答案 2 :(得分:3)
问题是:fetch
是在浏览器中定义的,可以fetch
,甚至是window.fetch
在服务器中它没有定义,要么需要导入显式,要么需要通过测试代码导入像https://www.npmjs.com/package/unfetch之类的polyfill(如错误消息中所示)以使问题消失