在流星中使用spacejam时,“全局未找到提取且没有提取器”

时间:2018-01-08 16:42:15

标签: javascript testing meteor graphql

我正在编写单元测试来检查我的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之外有例子,但仍然让我感到困惑)。我确实尝试使用该示例,但它没有帮助,我仍然得到相同的错误

3 个答案:

答案 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(如错误消息中所示)以使问题消失