Javascript Nock中作为主机名的相对URL

Javascript Nock中作为主机名的相对URL,javascript,mocha.js,fetch,nock,Javascript,Mocha.js,Fetch,Nock,我需要模拟客户端HTTP请求。我在客户端使用isomorphic fetch,在测试和模拟中使用mocha和nock。我的所有客户端请求都基于相对路径。因此,我无法提供nock的主机名。附近有工作吗 客户端: fetch('/foo') //hostname: http://localhost:8080 .then(res => res.json()) .then(data => console.log(data)) .catch(e => console.log(e)) 测

我需要模拟客户端HTTP请求。我在客户端使用
isomorphic fetch
,在测试和模拟中使用
mocha
nock
。我的所有客户端请求都基于相对路径。因此,我无法提供
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
提供正确的主机名。我做错什么了吗?

我刚刚在Nock的存储库上问了一个类似的问题。显然这是不受支持的:

为此找到了一个解决方法。在测试文件夹中有一个
\u ajax-setup.js

import $ from 'jquery'

$(document).ajaxSend((event, jqxhr, settings) => {
  settings.url = 'http://0.0.0.0' + settings.url;
})
需要注意的是,此文件必须首先运行,并且只运行一次。将其作为文件只运行一次,然后将其按字母顺序排在第一位

稍后,您可以使用

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

对于任何感兴趣的人:在我的react/webpack项目中,当
NODE\u ENV
设置为
'test'
时,我通过在fetch url前面加上“”解决了这个问题

例如:

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'})

注意:运行我的测试时,对于我添加到测试文件中的axios,NODE_ENV被设置为“测试”

。这有助于克服这一限制

    axios.defaults.baseURL='http://localhost:4000/';
请注意,这是一个全局变量。 这样,实际代码就可以与相对URL共存,而不需要检查其中的测试标志。

库德雷索夫对的回复描述了一种特定于Jest的解决方法

将其放入uuu mocks\uuuu/isomorphic-fetch.js:

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

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


请提供代码示例来说明其用法。
const fetch = require.requireActual('isomorphic-fetch');

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