0

我使用 fetch-mock、redux-mock-store、promise-middleware 来测试我的应用程序的 redux 实现。我有以下代码:

import configureMockStore from 'redux-mock-store';
import promiseMiddleware from 'redux-promise-middleware';
import fetchMock from 'fetch-mock';
import thunk from 'redux-thunk';
import createLogger from 'redux-logger';
import { bindActionCreators } from 'redux';
import { ACTION_1, hostNameSearchActions }
    from '../../../src/actions/hostNameSearchActions';

const middlewares = [thunk, promiseMiddleware(), createLogger()];
let mockStore = configureMockStore(middlewares);
const SERVICE_URL = 'http://url_to_the_service';
describe('Testing thunk actions', () => {
let store = mockStore({ hostData: { key1 :'value'} });
const aHostNameSearch = bindActionCreators({ ...hostNameSearchActions }, store.dispatch).hostNameSearch;
afterEach(() => {
        fetchMock.reset();
        fetchMock.restore();
        mockStore = configureMockStore(middlewares);
        store = mockStore({ hostData: { key1 :'value'} });
    });
it('ACTION_1_PENDING, ACTION_1_REJECTED dispatched, payload matches expected payload', (done) => {
    fetchMock
        .mock(`${SERVICE_URL}`,
            404 );

    const expectedActions = [
        { type: `${ACTION_1}_PENDING` },
        { type: `${ACTION_1}_REJECTED`, payload: {error: 'test.body.error.message'}}
    ];
    aHostNameSearch().then(() => {
        expect(store.getActions()).toEqual(expectedActions);
        done();
    });

});
});

问题是我用 retchMock 模拟的 404 调用总是最终被解析为 ACTION_1_FULFILLED。为什么会这样?我是否错误地嘲笑了电话?

4

1 回答 1

0

Redux Promise 中间件总是在给定一个被拒绝的操作时分派一个被拒绝的操作。如果您的模拟操作总是最终成为一个已完成的操作,那么当您期望一个被拒绝的操作时,那是因为承诺有效负载已完成。

如果您有任何副作用(例如,任何使用thenpromise 上的方法的函数)并且没有正确地将错误传递给中间件,则可能会发生这种情况。但是,如果没有更多的上下文,就不可能给你一个明确的答案。如果您包含您的hostNameSearchActions.

于 2018-04-30T12:14:25.070 回答