使用thunk进行Jest测试redux动作并不会覆盖状态

时间:2018-03-16 15:33:40

标签: unit-testing redux enzyme jest redux-thunk

您好我一直在尝试使用thunk和所有测试通过来测试函数但是无法弄清楚为什么覆盖范围不会更新或测试函数不包含该语句。

这是我的功能:

export const setFinished = (campaignId, userId, actionId, callback) => {
    return async (dispatch, getState) => {
        await axios.post(`http://bazuca.com:9000/campaigns/${campaignId}/progress`, {
            userId,
            actionId
        }, { headers: { token: getState().app.token } })
            .then((response) => {

            })
            .catch((error) => {

            })

        callback();
    }
}

这是我的 最后一次 测试(我已经完成了3种不同的类型,并且无法覆盖工作)

describe("setFinished", () => {

    it("works", () => {
        const dispatch = jest.fn();
        const callback = jest.fn(() => 'callback');
        const getState = jest.fn();
        let a = setFinished(1, 1, 1, callback)
        expect(a).toHaveBeenCalledWith(1, 1, 1, callback);
        a(dispatch, getState);
        expect(callback).toHaveBeenCalled();

    });
});

我只是在报道中得到这个:  enter image description here

也许我做错了?或者应该使用另一个图书馆?

1 个答案:

答案 0 :(得分:1)

您的测试设置中可能缺少某些内容。特别是你对调度模拟做出断言的方式看起来很不寻常。没有太多细节,只需考虑以下因素:

import configureMockStore from 'redux-mock-store';
import thunk from 'redux-thunk';

import { setFinished } from 'path/to/your/actions';

const middlewares = [thunk];
const mockStore = configureMockStore(middlewares);

describe('setFinished', () => {
    it('works', () => {
        // You have to make sure axios calls are mocked out properly
        // at this point. I don't have a snippet handy for this so I
        // left it out. But it would be similar to the following:
        axios.mockImplementationOnce(() => ({
            // Let the promise return whatever your response is for a
            // positive test case
            post: () => Promise.resolve({ isFinished: true })
        }));

        const expected = [
            // I'm assuming something like this is dispatched in the
            // .then handler of your action:
            { type: 'SET_FINISHED_SUCCESS' }
        ];

        const store = mockStore({});

        // Mock some arguments here
        return store.dispatch(setFinished(1, 2, 3, () => null))
            .then(() => expect(store.getActions()).toEqual(expected));
    });
});

如果axios被正确模拟,如果你还为catch块添加一个负面测试用例,这肯定会实现100%的覆盖率。