使用jest测试react-native应用程序时,出现“XMLHttpRequest未定义”的错误。

9

我正在尝试使用jest(集成测试)测试React Native应用程序中的apiwrapper。 当我在iOS模拟器中运行时,一切都正常,但它无法正确运行我的jest测试 - 我始终会收到以下错误信息:

ReferenceError: XMLHttpRequest is not defined

当我尝试使用我的API包装器运行测试时,例如:

it('Login successful with correct data', () => {
  let api = Api.getInstance();
  return api.login("test", "testpass")
         .then(result => expect(result).toEqual('login_successful'));
});

我正在尝试测试的API类使用了Fetch API(而不是原生XHR)。我认为这与Jest试图模拟某些东西有关,但我还没有找到让它工作的方法。
提前致谢。

可能是XHR testing in Jest的重复问题。 - the_bluescreen
我正在使用fetch而不是XHR,因此提供的解决方案并不能真正解决问题。虽然我实际上想进行集成测试。正确模拟fetch api也是可以接受的...但是我发现没有办法正确指定mock应该为哪些输入返回什么。 - dschlossfr
2个回答

3

在我的情况下,我不是在测试搜索代码,而是将其导入到我的代码路径中的某个地方,因此我决定在setup.js文件中全局模拟它(使用--require在测试运行时加载)。以下内容适用于我:

// needed in react-instantsearch
class XMLHttpRequest {}
global.XMLHttpRequest = XMLHttpRequest;

2

我在使用XMLHttpRequest时,遇到了与lokka相似的问题。我为我的api包装类依赖的lokka创建了一个模拟器。你可以尝试模拟你的api包装类。

这是现在我的lokka模拟器的样子。当我开始测试错误处理时,我会添加更多内容。

export default class {
  query() {
    return new Promise(resolve => {
      resolve(200);
    });
  }
}

你可以尝试使用类似的方法模拟你的API包装器:

可能会有人想用类似的方式来模拟API包装器:

export default class Api {      
  getInstance() {
    \\ However you implemented getInstance      
  }

  login(user, password) {
    return new Promise(resolve => {
      resolve('login_successful');
    });
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接