【问题标题】:Relative URL as hostname in Nock相对 URL 作为 Nock 中的主机名
【发布时间】:2016-03-22 23:05:47
【问题描述】:

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

【问题讨论】:

    标签: javascript mocha.js fetch nock


    【解决方案1】:

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

    示例:

    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 设置为“测试”

    【讨论】:

    • 请提供代码示例说明用法。
    【解决方案2】:

    找到了解决方法。在你的测试文件夹中有一个_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"})
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

          kudresov 对liorbauer's issue 的回复描述了一个 Jest 特定的解决方法。

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

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

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

          在其他测试框架中,您可以使用 rewire 之类的东西

          【讨论】:

          • 很容易成为同构提取的最佳解决方案。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-01-03
          • 2014-03-04
          • 2020-04-19
          • 1970-01-01
          • 2022-11-24
          • 1970-01-01
          • 2019-06-20
          相关资源
          最近更新 更多