这是一个有效的例子
jest
代码.js
import axios from 'axios';
export const FETCH_NAVIGATION_FEED = 'FETCH_NAVIGATION_FEED';
export const FETCH_NAVIGATION_FEED_SUCCESS = 'FETCH_NAVIGATION_FEED_SUCCESS';
class Category {
constructor(json) {
this.id = json.id;
this.name = json.name;
this.url = json.url;
}
}
class Asset {
constructor(json) {
this.id = json.id;
this.title = json.title;
}
}
export const fetchNavigationFeed = (navUrl, subId) => {
return async (dispatch) => {
dispatch({ type: FETCH_NAVIGATION_FEED });
const url = navUrl
.replace('__JTV__SUBSCRIBER__ID__', subId);
const response = await axios.get(url);
const categories = [];
const promises = [];
response.data.subCategories.forEach((subCategory) => {
const category = new Category(subCategory);
categories.push(category);
const promise = axios.get(category.url).then((subResponse) => {
category.assets = [];
subResponse.data.forEach((asset) => {
category.assets.push(new Asset(asset));
});
});
promises.push(promise);
});
// wait for all the promises simultaneously
await Promise.all(promises);
dispatch({ type: FETCH_NAVIGATION_FEED_SUCCESS, payload: categories });
}
}
代码.test.js
import axios from 'axios';
import {
fetchNavigationFeed,
FETCH_NAVIGATION_FEED,
FETCH_NAVIGATION_FEED_SUCCESS
} from './code';
const getMock = jest.spyOn(axios, 'get');
getMock.mockImplementation((url) => {
switch (url) {
case 'mainUrl-mySubId':
return Promise.resolve({
data: {
"id": 1,
"name": "home",
"subCategories": [
{
"id": 2,
"name": "sub1",
"url": "sub1Url",
},
{
"id": 3,
"name": "sub2",
"url": "sub2Url",
}
]
}
});
case 'sub1Url':
return Promise.resolve({
data: [
{
"id": 4,
"title": "asset1"
},
{
"id": 5,
"title": "asset2"
}
]
});
case 'sub2Url':
return Promise.resolve({
data: [
{
"id": 6,
"title": "asset3"
},
{
"id": 7,
"title": "asset4"
}
]
});
}
});
test('getData', async () => {
const asyncDispatch = fetchNavigationFeed('mainUrl-__JTV__SUBSCRIBER__ID__', 'mySubId');
const dispatch = jest.fn();
await asyncDispatch(dispatch);
expect(dispatch).toHaveBeenCalledTimes(2);
const firstCallArgs = dispatch.mock.calls[0];
expect(firstCallArgs).toEqual([{
type: FETCH_NAVIGATION_FEED
}]);
const secondCallArgs = dispatch.mock.calls[1];
expect(secondCallArgs).toEqual([{
type: FETCH_NAVIGATION_FEED_SUCCESS,
payload: [
{
id: 2,
name: 'sub1',
url: 'sub1Url',
assets: [
{
"id": 4,
"title": "asset1"
},
{
"id": 5,
"title": "asset2"
}
]
},
{
id: 3,
name: 'sub2',
url: 'sub2Url',
assets: [
{
"id": 6,
"title": "asset3"
},
{
"id": 7,
"title": "asset4"
}
]
}
]
}]);
});
注意:您可以使用
axios.all()
但是根据
this thread
它使用
Promise.all()