nock 是否仅在有 Internet 连接时才有效?
Does nock only work if there is an Internet connection?
我在使用 nock 测试我的 Redux 动作创建器时遇到了问题。当我离线时,我不断收到失败的承诺,这意味着使用 Axios 的 HTTP 请求不成功。不过,当我上网时,它会起作用。
So does nock only work if there is an Internet connection?
Action Creator(使用 axios 0.15.3)
export const fetchSomething = (id) => {
return dispatch => {
dispatch({
type: FETCH_SOMETHING_LOADING
});
return axios.get(`${SOMEWHERE}/something?id=${id}`)
.then(response => {
return dispatch({
type: FETCH_SOMETHING_SUCCESS,
payload: response.data
});
})
.catch(error => {
return dispatch({
type: FETCH_SOMETHING_FAILURE
});
});
};
};
动作创作者的 Jest 测试 (nock v9.0.2)
test('should dispatch success action type if data is fetched successfully', () => {
// Need this in order for axios to work with nock
axios.defaults.adapter = require('axios/lib/adapters/http');
nock(SOMEWHERE)
.get('/something?id=123')
.reply(200, someFakeObject);
thunk = fetchSomething(123);
return thunk(dispatch)
.then(() => {
expect(dispatch.mock.calls[1][0].type).toBe('FETCH_SOMETHING_SUCCESS');
});
});
据我所知,nock
npm 模块只能在 Node 中使用,不能在浏览器中使用。您是在测试套件中使用 nock,还是在开发时作为 API 的 fill-in?如果是后者,我认为 nock 中间件将无法工作。当您连接到互联网时,您可能会看到来自真实 API 而不是模拟 api 的响应,并且 nock 没有拦截任何内容。
如果您想尝试在节点和浏览器中都可以使用的类似适配器,请查看 axios-mock-adapter
使用 nock 测试 axios 发出的请求似乎存在一些问题。有一个 issue in nock's repository 讨论了这个问题。
我发现 @supnate
对那个问题的评论解决了我的问题。此外,我在我的代码中调用了 beforeEach()
构造中的 nock.cleanAll();
,这是问题的 罪魁祸首 。
解决办法是删除它。不要使用 nock.cleanAll()
!所以现在一切都可以很好地测试 axios 发出的请求:
import axios from 'axios';
import httpAdapter from 'axios/lib/adapters/http';
axios.defaults.host = SOMEWHERE; // e.g. http://www.somewhere.com
axios.defaults.adapter = httpAdapter;
describe('Your Test', () => {
test('should do something', () => {
nock(SOMEWHERE)
.get('/some/thing/3')
.reply(200, { some: 'thing', bla: 123 });
// then test your stuff here
);
});
我在使用 nock 测试我的 Redux 动作创建器时遇到了问题。当我离线时,我不断收到失败的承诺,这意味着使用 Axios 的 HTTP 请求不成功。不过,当我上网时,它会起作用。
So does nock only work if there is an Internet connection?
Action Creator(使用 axios 0.15.3)
export const fetchSomething = (id) => {
return dispatch => {
dispatch({
type: FETCH_SOMETHING_LOADING
});
return axios.get(`${SOMEWHERE}/something?id=${id}`)
.then(response => {
return dispatch({
type: FETCH_SOMETHING_SUCCESS,
payload: response.data
});
})
.catch(error => {
return dispatch({
type: FETCH_SOMETHING_FAILURE
});
});
};
};
动作创作者的 Jest 测试 (nock v9.0.2)
test('should dispatch success action type if data is fetched successfully', () => {
// Need this in order for axios to work with nock
axios.defaults.adapter = require('axios/lib/adapters/http');
nock(SOMEWHERE)
.get('/something?id=123')
.reply(200, someFakeObject);
thunk = fetchSomething(123);
return thunk(dispatch)
.then(() => {
expect(dispatch.mock.calls[1][0].type).toBe('FETCH_SOMETHING_SUCCESS');
});
});
据我所知,nock
npm 模块只能在 Node 中使用,不能在浏览器中使用。您是在测试套件中使用 nock,还是在开发时作为 API 的 fill-in?如果是后者,我认为 nock 中间件将无法工作。当您连接到互联网时,您可能会看到来自真实 API 而不是模拟 api 的响应,并且 nock 没有拦截任何内容。
如果您想尝试在节点和浏览器中都可以使用的类似适配器,请查看 axios-mock-adapter
使用 nock 测试 axios 发出的请求似乎存在一些问题。有一个 issue in nock's repository 讨论了这个问题。
我发现 @supnate
对那个问题的评论解决了我的问题。此外,我在我的代码中调用了 beforeEach()
构造中的 nock.cleanAll();
,这是问题的 罪魁祸首 。
解决办法是删除它。不要使用 nock.cleanAll()
!所以现在一切都可以很好地测试 axios 发出的请求:
import axios from 'axios';
import httpAdapter from 'axios/lib/adapters/http';
axios.defaults.host = SOMEWHERE; // e.g. http://www.somewhere.com
axios.defaults.adapter = httpAdapter;
describe('Your Test', () => {
test('should do something', () => {
nock(SOMEWHERE)
.get('/some/thing/3')
.reply(200, { some: 'thing', bla: 123 });
// then test your stuff here
);
});