【发布时间】:2018-08-06 06:28:54
【问题描述】:
我从单元测试和 Jest 开始。我想要的是在从数据库中获取一些资源后测试操作的响应。
这是操作代码:
export function loadPortlets() {
return function(dispatch) {
return portletApi.getAllPortlets().then(response => {
dispatch(loadPortletsSuccess(response));
dispatch(hideLoading());
}).catch(error => {
dispatch({ type: null, error: error });
dispatch(hideLoading());
throw(error);
});
};
}
此代码正在从以下位置获取数据:
static getAllPortlets() {
return fetch(`${API_HOST + API_URI}?${RES_TYPE}`)
.then(response =>
response.json().then(json => {
if (!response.ok) {
return Promise.reject(json);
}
return json;
})
);
}
这是测试:
import configureMockStore from 'redux-mock-store';
import thunk from 'redux-thunk';
import fetch from 'isomorphic-fetch';
import fetchMock from 'fetch-mock';
import * as actions from '../portletActions';
import * as types from '../actionTypes';
const middlewares = [thunk];
const mockStore = configureMockStore(middlewares);
const mockResponse = (status, statusText, response) => {
return new window.Response(response, {
status: status,
statusText: statusText,
headers: {
'Content-type': 'application/json'
}
});
};
describe('async actions', () => {
afterEach(() => {
fetchMock.reset();
fetchMock.restore();
})
it('calls request and success actions if the fetch response was successful', () => {
window.fetch = jest.fn().mockImplementation(() =>
Promise.resolve(mockResponse(200, null, [{ portlets: ['do something'] }])));
const store = mockStore({ portlets: []});
return store.dispatch(actions.loadPortlets())
.then(() => {
const expectedActions = store.getActions();
expect(expectedActions[0]).toContain({ type: types.LOAD_PORTLETS_SUCCESS });
})
});
});
这是运行测试的结果:
FAIL src\actions\__tests__\portletActions.tests.js
● async actions › calls request and success actions if the fetch response was successful
expect(object).toContain(value)
Expected object:
{"portlets": [// here an array of objects], "type": "LOAD_PORTLETS_SUCCESS"}
To contain value:
{"type": "LOAD_PORTLETS_SUCCESS"}
at store.dispatch.then (src/actions/__tests__/portletActions.tests.js:56:34)
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:188:7)
在此示例的 redux 文档 (https://redux.js.org/recipes/writing-tests) 中,他们收到的结果仅包含执行的操作类型,但我得到的是真实数据和数组内的操作。
所以我不确定是代码错了,还是测试错了,或者两者都有!
在此先感谢,非常感谢任何帮助!
【问题讨论】:
-
如果将
window.fetch更改为global.fetch会怎样? -
嗨@LanceHarper!感谢您的答复。也是一样,我也在api文件中使用
import fetch from 'isomorphic-fetch';。 -
您使用的是
setupJest.js文件吗?配置setupJest.js文件后,您可以分配global.fetch = require('jest-fetch-mock')。然后在您的测试中,您可以使用fetch.mockResponse(JSON.stringify({ ... })分配预期的响应 -
谢谢@LanceHarper 我没有
setupJest.js文件,我应该把它放在哪里?只是在我的测试中创建和导入?我正在寻找一个例子,但我发现的那些看起来非常先进,可以满足我的需要
标签: reactjs redux fetch jestjs jest-fetch-mock