使用thunk在redux中测试异步中间件

时间:2017-03-08 09:52:06

标签: unit-testing testing redux react-redux redux-thunk

我有一个等待ARTICLE_REQUEST操作的中间件,执行fetch并在完成提取时调度ARTICLE_SUCCESSARTICLE_FAILURE操作。像这样

import { articleApiUrl, articleApiKey } from '../../environment.json';
import { ARTICLE_REQUEST, ARTICLE_SUCCESS, ARTICLE_FAILURE } from '../actions/article';

export default store => next => action => {

    // Prepare variables for fetch()
    const articleApiListUrl = `${articleApiUrl}list`;
    const headers = new Headers({ 'Content-Type': 'application/json', 'x-api-key': articleApiKey });
    const body = JSON.stringify({ ids: [action.articleId] });
    const method = 'POST';

    // Quit when action is not to be handled by this middleware
    if (action.type !== ARTICLE_REQUEST) {
        return next(action)
    }

    // Pass on current action
    next(action);

    // Call fetch, dispatch followup actions and return Promise
    return fetch(articleApiListUrl, { headers, method, body })
        .then(response => response.json());   
        .then(response => {
            if (response.error) {
                next({ type: ARTICLE_FAILURE, error: response.error });
            } else {
                next({ type: ARTICLE_SUCCESS, article: response.articles[0] });
            }
        });

}

我真的很想知道如何测试这个异步代码。我想看看是否会正确调度后续操作,也许是否使用正确的URL和params调用fetch调用。任何人都可以帮助我吗?

PS:我正在使用thunk,虽然我并不完全确定它的功能,因为我只是按照另一个代码示例

1 个答案:

答案 0 :(得分:0)

您可以像这样模拟fetch()函数:

window.fetch = function () {
  return Promise.resolve({
    json: function () {
      return Prommise.resolve({ … your mock data object here … })
    }
  })
}

或者将整个中间件包装在一个函数中:

function middlewareCreator (fetch) {
  return store => next => action => { … }
}

然后使用实际的fetch方法作为参数创建中间件,以便您可以将其交换为测试或生产。