带有fetch-mock生成错误的Jest:TypeError:在nodejs上使用时,无法读取undefined的属性“prototype”

ve7v8dk2  于 2023-03-06  发布在  Jest
关注(0)|答案(3)|浏览(142)

我几乎可以肯定这是我的错误,但我花了一整天的时间试图解决,我已经失败了。😞.
我尝试在node上配置fetch-mock来使用jest。我尝试了很多方法,最好的结果是:
https://user-images.githubusercontent.com/824198/50566568-7b49e400-0d22-11e9-884f-89720899de3a.png
我确信我的模拟是工作的,因为如果我通过参数传递给"Myclass.query",它会完美地工作。
我还确信mock已经到达我的测试文件,因为mock函数存在于fetch模块中。
但是......合在一起是行不通的。😭.
我创建了一个非常简单的小项目来观察这个问题的发生:
https://github.com/cesarjr/test-node-fetch
有人能帮帮我吗?

hfwmuf9z

hfwmuf9z1#

在测试过程中,只要需要node-fetchJest就会使用__mocks__/node-fetch.js处的模拟。
问题是fetch-mock做的第一件事就是需要node-fetch
这意味着,在此处的config上设置Request时,没有定义它,因此在未定义的Request上调用prototype会在此处导致错误。
比我聪明的人可能知道如何在fetch-mock需要node-fetch的模拟中强制Jest需要实际的node-fetch,但从我所看到的来看,这似乎是不可能的。
看起来你必须删除__mocks__/node-fetch.js处的mock,并将fetch传递给你的代码,如下所示:
myclass.js

class MyClass {
  static query(fetch, sessionId, query) {
    const url = 'https://api.foobar.com';

    const body = {
      sessionId,
      query
    };

    return fetch(url, {
      method: 'post',
      body: JSON.stringify(body)
    })
      .then(res => res.json());
  }
}

module.exports = MyClass;

...然后在测试中创建sandbox并将其传递给代码,如下所示:
myclass.test.js

const fetch = require('fetch-mock').sandbox();
const MyClass = require('./myclass');

describe('MyClass', () => {
  describe('.query', () => {
    it('returns the response', () => {
      fetch.mock('*', {'result': {'fulfillment': {'speech': 'The answer'}}});

      expect.assertions(1);

      return MyClass.query(fetch, '123', 'the question').then((data) => {
        expect(data.result.fulfillment.speech).toBe('The answer');  // SUCCESS
      });
    });
  });
});
3b6akqbq

3b6akqbq2#

现在我找到了一种可靠的方法来合并fetch-mock和jesthttp://www.wheresrhys.co.uk/fetch-mock/#usageusage-with-jest

qnakjoqk

qnakjoqk3#

我遇到过类似的问题,一些Date函数被jest.fn模拟,以避免在每个快照中出现今天的日期。
根据上面的答案,我猜想jest自己在准备模仿这些方法之前,一定已经使用了这些方法。
在我的例子中,模拟实际上不需要是完整的jest模拟(即jest.fn((...params...) => ...body...)),只需一个普通的模拟函数就足够了(即(...params...) => ...body...),所以修改这个就可以了。

相关问题