18

我需要模拟客户端 HTTP 请求。我isomorphic-fetch在客户端使用,我正在使用mochaandnock进行测试和模拟。我所有的客户请求都基于相对路径。因此,我无法为nock. 有解决办法吗。

客户端:

fetch('/foo') //hostname: http://localhost:8080
.then(res => res.json())
.then(data => console.log(data))
.catch(e => console.log(e))

测试套件

nock('/')
.get('/foo')
.reply(200, {data: "hello"})

这是失败的,因为我没有为nock. 难道我做错了什么?

4

5 回答 5

6

对于任何感兴趣的人:在我的 react / webpack 项目中,我通过在设置NODE_ENV'test'.

例子:

const testing = process.env.NODE_ENV === 'test';
const apiUrl = `${testing ? 'http://localhost' : ''}/api`;

function getStuffFromApi() {
  return fetch(apiUrl, ...)
}

这样,在我的测试中,我总是可以像这样使用 nock:

nock('http://localhost')
  .get('/api')
  .reply(200, {data: 'hello'})

注意:运行我的测试时,NODE_ENV 设置为“测试”

于 2016-06-22T12:28:21.897 回答
2

我刚刚在 Nock 的存储库上问了一个类似的问题。显然这不受支持:https ://github.com/pgte/nock/issues/431

于 2015-12-23T12:13:44.390 回答
2

找到了解决方法。_ajax-setup.js在您的测试文件夹中有一个

import $ from 'jquery'

$(document).ajaxSend((event, jqxhr, settings) => {
  settings.url = 'http://0.0.0.0' + settings.url;
})

需要注意的是,这个文件必须运行First and Only Once。将其作为文件仅运行一次,_然后按字母顺序排列。

稍后您可以使用

nock('http://0.0.0.0')
.get('/foo')
.reply(200, {data: "hello"})
于 2016-02-20T07:44:55.287 回答
2

对于 axios,我在测试文件中添加了以下内容。这有助于克服这一限制。

    axios.defaults.baseURL='http://localhost:4000/';

请注意,这是一个全局变量。有了这个,实际代码可以使用相对 URL,并且不需要检查其中的测试标志。

于 2016-11-18T17:43:24.573 回答
2

kudresov 对liorbauer 问题的回复描述了一个 Jest 特定的解决方法。

把它放到 __mocks__/isomorphic-fetch.js 中:

const fetch = require.requireActual('isomorphic-fetch');

module.exports = (url, config) => {
  return fetch('https://localhost' + url, config);
};

Jest 然后自动替换此节点模块的所有需求(或导入)。

在其他测试框架中,您可以使用类似rewire

于 2017-04-11T21:32:19.670 回答