相对URL作为Nock中的主机名

时间:2015-12-16 17:26:32

标签: javascript mocha fetch nock

我需要模拟客户端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提供正确的主机名。我做错了吗?

5 个答案:

答案 0 :(得分:6)

对于任何感兴趣的人:在我的react / webpack项目中,我通过在NODE_ENV设置为'test'时将获取网址前置为“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设置为'test'

答案 1 :(得分:3)

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

DECLARE TopTime TIMESTAMP ;
DECLARE trans_Curs CURSOR FOR 
         SELECT ots.associate_trans.trans_code  
           FROM ots.associate_trans  
          WHERE ots.associate_trans.usage_code = :ggs_vars.usage
            AND ots.associate_trans.Timestamp  < TopTime
          ORDER BY ots.associate_trans.trans_code 
          LIMIT 1000 ;
:
:
IF (p_Start_Timestamp IS NULL) THEN
    TopTime = CURRENT_TIMESTAMP() ;
ELSE
    TopTime = p_Start_Timestamp  ;
END IF ;

OPEN trans_Curs;
FETCH  trans_Curs INTO :ll_transId;
:
:

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

答案 2 :(得分: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 :(得分:1)

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

答案 4 :(得分:1)

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

的内容