首页 文章

使用sinon为reducex动作创建一个闭包函数

提问于
浏览
0

我有一个redux动作,它有一个异步调用API .

import { ForbiddenRequest, APIError } from "../errors"
import { fetchActionCreator } from "redux-fetch-helpers"

export const ADD_CART_ITEMS = "ADD_CART_ITEMS"

export default function addCartItems(items, authToken){
    return fetchActionCreator({
        url: `${API_BASE}/ajax_cart`, //eslint-disable-line no-undef
        fetchOptions: {
            method: "POST",
            headers: new Headers({
                "Authorization": `jwt ${authToken}`,
                "Accept": "application/json",
                "Content-Type": "application/json",
            }),
            body: JSON.stringify(items),
            credentials: "same-origin",
        },
        actionType: ADD_CART_ITEMS,
        responseConfig: {
            200: (resp => resp),
            403: (payload => new ForbiddenRequest(payload)),
            other: (payload => new APIError(payload)),
        }
    })
}

我试图通过使用sinon存根来模拟fetchActionCreator方法 . 这是我的spec文件

import addCartItems from "../../actions/addCartItems"
import sinon from "sinon"

describe("The addCartItems action", () => {
    let fetchActionCreator
    it("should create an action to add an item into the cart", () => {
        const addedCartItem = {
            items: [{product_variant: 10, quantity: 1}]
        }
        const expectedAction = { type: "ADD_CART_ITEMS", meta: {sequence: "BEGIN"}}
        fetchActionCreator = sinon.stub()
        // fetchActionCreator()
        fetchActionCreator.returns(expectedAction)
        expect(addCartItems(addedCartItem, "someToken")).to.equal(expectedAction)
    })

})

但不知何故,这个功能并没有被嘲笑 . 你能告诉我正确的方法吗?

1 回答

  • 2

    您需要从正在调用的库中存根实际函数,而不仅仅是创建具有相同名称的存根 .

    在测试中将以下内容添加到导入中:

    import * as reduxFetchHelpers from 'redux-fetch-helpers';
    

    然后到测试的主体,用以下内容替换当前的存根代码:

    const fetchActionCreator = sinon.stub(reduxFetchHelpers, 'fetchActionCreator');
    fetchActionCreator.returns(expectedAction);
    

    我没有测试过这段代码,但它看起来应该可行 .

相关问题