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