当前位置: 首页 > 知识库问答 >
问题:

存根闭包函数使用sinon的redux动作

郗浩言
2023-03-14

我有一个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方法。这是我的规范文件

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个答案

公冶龙野
2023-03-14

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

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

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

然后,在测试正文中,将当前存根代码替换为:

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

我还没有测试过这段代码,但它看起来应该可以工作。

 类似资料:
  • 我有一个Redux操作,它本身分派了另外两个操作。每个操作都是从导入的函数中检索的。一个来自本地模块,另一个来自外部库。 在我的测试中,我使用一个 沙箱来存根函数,但只有两个测试通过。我期待所有3个都通过。 最后一个预期失败,错误为: TypeError:[Function:functionB]不是间谍或对间谍的调用! 当我将功能输出到控制台时,我得到了这个,这似乎与Babel导入导出导出的方式有

  • 我有一个带有路由器的express应用程序,我想与Sinon一起测试。我无法成功模拟传递到请求处理程序的参数,希望能得到一些帮助。 这是我当前使用Mocha、Sinon、Chai的测试设置

  • 问题内容: 我希望对我当前正在测试的文件中使用的函数存根。像这样的解构需要此函数: 测试时,永远不会调用存根,而是继续调用实函数。但是当我“正常”地要求它时(即:不破坏结构) 然后正确使用存根,一切正常 我感觉这是因为解构的工作原理以及直接对对象属性而不是对函数进行存根的事实。无论如何,如果您能为我提供一些见解,我将不胜感激! 问题答案: 使用从从属模块进行解构时,对模块的方法进行插桩的原因很简单

  • 我希望在当前测试的文件中存根一个函数。此函数在进行如下分解时是必需的: 在测试时,永远不会调用存根,而是继续调用实际函数。但当我“正常”需要它时(即:不进行分解) 然后正确使用存根,一切正常 我感觉到这是因为析构是如何工作的,事实上存根是对象属性,而不是直接的函数。无论如何,如果你能给我提供一些见解,我将不胜感激!

  • 所以我在用摩卡酵素Sinon测试React app。我试图用if语句测试一个函数,其中有一个对另一个函数的调用。我的目标是输入if语句,但是存根第二个函数调用。代码如下: 所以我想输入if语句,但不调用getUsers()函数。我该怎么做?我正在监视SearchChange(),如下所示: 期待听到,谢谢!

  • 我在获取一个sinon存根以返回/解析另一个sinon存根时遇到问题。我正在使用西农、柴、柴和摩卡。 我正在按顺序执行许多异步任务,我想测试的代码看起来像这样: 我尝试为此创建存根的尝试如下所示: “saveit”方法在Terminal.prototype,这就是为什么我需要在那里存根它。当我尝试运行它时,我收到错误消息: 在线上: 但如果我在控制台中转储终端对象,它看起来很好,就像任何其他存根对