【发布时间】:2018-04-26 16:38:16
【问题描述】:
我的问题是我试图对一个函数进行单元测试,但不知道如何测试它的一部分。
这是一个 react / redux 操作,它执行以下操作:
1) 使用图像 url 检索 json 数据
2) 将图像加载到 Image 实例中并将其大小分派给 reducer(使用 Image.onload 加载图像时异步)
3) 将 fetch 完成的 dispatch 发送到 reducer
图像加载是异步发生的,所以当我尝试对其进行单元测试时,它不会被调用。此外,我不能只是模拟出来,因为图像实例是在函数中创建的......
这是我想要测试的代码(删除一些检查、分支逻辑和其他东西):
export function fetchInsuranceCardPhoto() {
return dispatch => {
dispatch(requestingInsuranceCardPhoto());
return fetch(`${api}`,
{
headers: {},
credentials: 'same-origin',
method: 'GET',
})
.then(response => {
switch (response.status) {
case 200:
return response.json()
.then(json => {
dispatch(receivedInsuranceCardPhoto(json));
})
}
});
};
}
function receivedInsuranceCardPhoto(json) {
return dispatch => {
const insuranceCardFrontImg = json.insuranceCardData.url_front;
const insuranceCardBackImg = json.insuranceCardData.url_back;
if (insuranceCardFrontImg) {
dispatch(storeImageSize(insuranceCardFrontImg, 'insuranceCardFront'));
}
return dispatch(receivedInsuranceCardPhotoSuccess(json));
};
}
function receivedInsuranceCardPhotoSuccess(json) {
const insuranceCardFrontImg = json.insuranceCardData.url_front;
const insuranceCardBackImg = json.insuranceCardData.url_back;
const insuranceCardId = json.insuranceCardData.id;
return {
type: RECEIVED_INSURANCE_CARD_PHOTO,
insuranceCardFrontImg,
insuranceCardBackImg,
insuranceCardId,
};
}
function storeImageSize(imgSrc, side) {
return dispatch => {
const img = new Image();
img.src = imgSrc;
img.onload = () => {
return dispatch({
type: STORE_CARD_IMAGE_SIZE,
side,
width: img.naturalWidth,
height: img.naturalHeight,
});
};
};
}
注意最后一个 storeImageSize 私有函数是如何创建 Image 的实例和分配给函数的 image.onload 的。
现在这是我的测试:
it('triggers RECEIVED_INSURANCE_CARD_PHOTO when 200 returned without data', async () => {
givenAPICallSucceedsWithData();
await store.dispatch(fetchInsuranceCardPhoto());
expectActionsToHaveBeenTriggered(
REQUESTING_INSURANCE_CARD_PHOTO,
RECEIVED_INSURANCE_CARD_PHOTO,
STORE_CARD_IMAGE_SIZE,
);
});
但此测试将失败,因为测试在调用 image.onload 回调之前完成。
如何强制调用 image.onload 回调,以便测试 `STORE_CARD_IMAGE_SIZE 操作是否被广播?
【问题讨论】:
标签: javascript unit-testing react-redux jestjs