首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使用redux-saga测试` `call(fn,params)`

redux-saga是一个用于管理应用程序副作用(例如异步请求和数据获取)的库。它允许您以声明性和可测试的方式处理副作用,其中call(fn, params)是redux-saga中的一个效果(effect),用于调用一个函数并返回一个描述该调用的对象。

要测试call(fn, params),您可以使用redux-saga提供的测试工具和技术。下面是一个完整的测试示例:

  1. 首先,安装所需的依赖项:npm install redux-saga redux-saga-test-plan
  2. 创建一个测试文件,例如saga.test.js,并导入所需的模块:import { call, put } from 'redux-saga/effects'; import { expectSaga } from 'redux-saga-test-plan'; import { mySaga, myApi } from './saga'; // 假设您有一个名为mySaga的saga和一个名为myApi的API函数
  3. 编写测试用例:describe('mySaga', () => { it('should handle call effect', () => { const params = { id: 1 }; const response = { data: 'example' }; return expectSaga(mySaga) .provide([[call(myApi, params), response]]) // 模拟调用myApi并返回response .put({ type: 'SUCCESS', payload: response }) // 检查是否正确触发了一个put effect .dispatch({ type: 'FETCH_DATA', payload: params }) // 触发一个action来启动saga .run(); }); });

在上面的示例中,我们使用expectSaga函数来创建一个saga测试。通过使用.provide方法,我们模拟了call(myApi, params)的调用,并返回了一个自定义的响应。然后,我们使用.put方法来检查是否正确触发了一个put effect,即在调用成功后触发了一个{ type: 'SUCCESS', payload: response }的action。最后,我们使用.dispatch方法来触发一个action,以启动我们的saga。最后,使用.run方法来运行测试。

这是一个基本的测试示例,您可以根据您的具体需求进行扩展和定制。请注意,这只是一个示例,实际的测试可能会因您的代码结构和需求而有所不同。

推荐的腾讯云相关产品和产品介绍链接地址:

请注意,以上链接仅供参考,具体的产品选择应根据您的实际需求和偏好进行评估和决策。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 手写Redux-Saga源码

    本文要讲的就是Redux-Saga,这个也是我在实际工作中使用最多的Redux异步解决方案。...Redux-Sagacall这个effect,这样做可以让我们写单元测试变得更简单,为什么会这样,我们后面讲源码的时候再来仔细看看。...fork的使用call很像,也是可以直接调用传进来的方法,只是call会等待结果回来才进行下一步,fork不会阻塞这个过程,而是当前结果没回来也会直接运行下一步: fork(fn, ...args);...) { return makeEffect('FORK', { fn }) } export function call(fn, ...args) { return makeEffect('CALL...但是如果你使用Redux-Saga的effect,每次你代码运行的时候得到的都是一个任务描述对象,这个对象是稳定的,不受运行结果影响,也就不需要针对这个造测试数据了,大大减少了工作量。

    1.7K30

    redux-saga

    所以添一层描述对象来解决这个问题,测试case中可以简单比较描述对象,实际起作用的Promise由redux-saga内部生成 这样做的好处是单测中不用mock异步方法(一般单测中会把所有异步方法替换掉...], 'user/info', userId); 形式上与fn.call类似(实际上也提供了一个apply creator,形式与fn.apply类似),内部处理也是类似的: // call返回的描述对象..., fn: fetch } }// 实际执行 result = fn.apply(context, args) 写起来不那么直接,但比起易测试性带来的好处(不用mock异步函数),这不很过分...注意,不需要mock异步函数只是简化了单元测试的一个环节,即便使用这种对比描述对象的方式,仍然需要提供预期的数据,例如: // 测试场景直接执行 const iterator = fetchProducts...yield* iterator运行时展开也面临不便测试的问题,所以通过call包一层Effect。

    1.9K41

    JavaScript 中的函数式编程:纯函数与副作用

    由于纯函数的输出完全由输入决定,所以测试起来非常简单和直观。...测试困难:测试具有副作用的函数需要考虑更多的因素,包括外部状态的初始值和变化,增加了测试的复杂性。代码维护困难:副作用可能导致代码之间的紧密耦合,使得代码的修改和扩展变得困难。...如何管理副作用隔离副作用:将副作用集中在特定的模块或函数中,以便更好地控制和管理它们。采用函数式副作用处理库:例如 redux-saga 或 redux-thunk 用于处理异步操作等副作用。...使用高阶函数管理副作用withLogging 是一个高阶函数,它接受一个函数 fn 并返回一个新的函数,这个新函数在调用 fn 前后打印日志。...使用 redux-saga 管理副作用Action Creator(动作创建者)// actions.jsconst fetchDataSaga = () => ({ type: 'FETCH_DATA_SAGA

    12600

    redux-saga入门

    Effects是一些简单对象,如下put({ type: ‘increment’ }),我们使用redux-saga提供的put方法创建一个Effect对象。...call(fn, args):它将创建一个Effect,用来命令中间件以args参数调用fnfn可以是一个Generator函数也可以是一个返回Pormise或任意其他值的普通函数。...fork(fn, ...args) : fork创建一个Effect,命令中间件以非阻塞的形式调用fn,且返回一个task对象,类似非阻塞形式的call。...fork表现形式为创建一个分叉的task去执行fn,且fork所在的saga不会在等待fn返回结果的时候被中间件暂停,相反,它在fn被调用时便会立即恢复执行。...而all可能是阻塞的也有可能是非阻塞的,这取决于all中创建Effect的形式,如果all参数中使用非阻塞的方法创建任务,那么all就不会阻塞all后面的代码,比如yield all ([call(task1

    1.3K20

    前端实现异步的几种方式_redux是什么

    redux-saga就是一个帮你管理这堆saga的管家,那么它跟其他的中间件实现有什么不同呢?它使用了ES6中Generator函数语法。...然后我们看下workerSaga,可以看到并不是直接调用异步函数或者派发action,而是通过call()以及put()这样的函数。这就是redux-saga中最为重要的一个概念:Effect。...但是这样的话不好做模拟(mock)测试:我们在测试过程中,一般不会真的执行异步任务,而是替换成一个假函数。实际上,我们只需要确保yield了一个正确的函数,并且函数有着正确的参数。...这条指令是一个纯Javascript对象(类似于action): { CALL: { fn: Api.fetchUser, args: ['alice'] } } 这样,当我们需要测试...(Api.fetchUser, 'alice'), "Should yield an Effect call(Api.fetchUser, 'alice')" ) 为了实现这一目标,redux-saga

    1.7K30

    每日一题

    如何实现呢? 在高频事件(例如浏览器页面滚动)触发时,为了优化提升性能,我们经常使用到防抖与节流。...call 比 apply 的性能要好,平常可以多用 call, call 传入参数的格式正是内部所需要的格式 为什么通常在发送数据埋点请求的时候使用的是 1x1 像素的透明 gif 图片?...Web Worker 是什么,如何使用 是什么 JavaScript 语言采用的是单线程模型,也就是说,所有任务只能在一个线程上完成,一次只能做一件事。...redux-saga redux-saga 是一个用于管理应用程序 Side Effect(副作用,例如异步获取数据,访问浏览器缓存等)的 library,它的目标是让副作用管理更容易,执行更高效,测试更简单...redux-saga 使用了 ES6 的 Generator 功能,让异步的流程更易于读取,写入和测试

    1.2K20

    Python廖雪峰实战web开发(Day5-编写web框架)

    同时,这样编写简单的函数而非引入request和web.Response还有一个额外的好处,就是可以单独测试,否则,需要模拟一个request才能测试。...因为是以aiohttp框架为基础,要达到上述预期的效果,也是需要符合aiohttp框架要求,因此就需要考虑如何在request对象中,提取使用者编写的函数中需要用到的参数信息,以及如何将函数的返回值转化...): #判断有没有命名关键字参数     params = inspect.signature(fn).parameters     for name,param in params.items():..._has_request_arg = has_request_arg(fn)     async def __call__(self,request): #__call__这里要构造协程        ...测试运行  最后,当然就要测试一下看能不能跑得动了,一下是代码:  import asyncio from web_app.webframe import get,post #编写用于测试的URL处理函数

    1.1K00
    领券