如何通过模拟选择器和/或 redux 存储来编写 Redux Saga 测试

2024-03-29

Context:我是编写 Redux Saga 测试的新手,并且一直在使用反应样板 https://github.com/react-boilerplate开发一个应用程序,该应用程序使用 Jest 进行测试。样板文件非常模块化且复杂,我什至不知道如何开始编写测试来模拟选择器并声明我的 Saga 在测试中使用。

在 Saga 中,我使用 Reselect(在“./selectors”文件中)从减速器中获取“用户名”和“密码”,并使用以下命令将它们分配给常量:yield select,并使用它来运行 API 调用。我不认为我的问题在于测试传奇,而是模拟传奇中的状态和选择器以模仿登录信息已填写并可以从状态中获取。

import { takeLatest, call, put, select } from 'redux-saga/effects';
import { loginSuccess, loginFailed } from '../App/actions';
import { ON_LOGIN } from '../App/constants';
import {
  makeSelectUsername,
  makeSelectPassword,
} from './selectors';
import api from '../../utils/api';

// LISTENER
export default function* loginRequestListener() {
  yield takeLatest(ON_LOGIN, login);
}

// WORKER
export function* login() {
  const loginParams = {
    username: yield select(makeSelectUsername()),
    password: yield select(makeSelectPassword()),
    isForceLoginAttempt: yield select(makeSelectIsForceLogin()),
  };

    try {
      const user = yield call(api.user.login, loginParams);
      yield put(loginSuccess(user));
    } catch (error) {
      yield put(loginFailed(error.response.data));
    }
}

基本上我正在寻找的是一种在测试中运行传奇的方法,以便在传奇中,我可以“强制”loginParams对象使用“fakeState”供选择器使用,因为显然状态不存在这里:

const fakeState = {username: 'test', password: 'test'}

export function* login() {
  const loginParams = {
    username: yield select(makeSelectUsername()) // 'test'
    password: yield select(makeSelectPassword()) // 'test'
  };

我一直在看redux-saga-tester作为测试传奇的一种手段,我只是想我不知道从哪里开始模拟测试中的状态,我的传奇可以将常量分配给......我认为从那里我可以处理其余的事情。

有没有人,特别是如果您使用过样板文件,有什么建议吗?


我们在我们的应用程序中使用 redux-saga-tester ,我们处理这个问题的方式不是通过传递一个假状态,我们使用 .next 方法,然后返回我们期望的特定测试结果。请参阅下面的案例了解我所描述的内容。

const activeOrderId = '1111';

//returns the value for a isConnected boolean
  it.next('should get isConnected', (result) => {
    expect(result).toEqual(select(getIsConnected));
    return true;
  });

// returns the value for an activeOrderId
  it.next('should get activeOrderId', (result) => {
    expect(result).toEqual(select(getActiveOrderId));
    return activeOrderId;
  });`

这种方法的优点是,您不必为所有传奇定义一个大的“假状态”,并且每个传奇的测试都与之分离。无论如何,您应该对选择器进行单独的测试,以确保它们正常工作。一般而言,saga 测试的一个痛点是,如果您的 saga 中有任何类型的控制流(if/else),那么全面测试所有内容的最佳策略似乎是为该 saga 编写整个其他测试流程。说你有这个

isConnected = yield select(getIsConnected)
if(isConnected) {
   // do x
} else {
   // do y
}

我们通过编写两个描述来处理这个问题。一个我们将 isConnected 设置为 true(如上例所示),另一个我们将其设置为 false,如下所示

    //returns the value for a isConnected boolean
  it.next('should get isConnected', (result) => {
    expect(result).toEqual(select(getIsConnected));
    return false;
  });

如果您需要将有效负载传递给 saga,您可以使用 sagaHelper 函数来处理它,如下所示

  it.next = sagaHelper(login({
     username: 'testUsername',
     password: 'testPassword',
     // etc
  }));

希望有帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过模拟选择器和/或 redux 存储来编写 Redux Saga 测试 的相关文章

  • 设置 location.hash 时防止默认行为

    当我这样做时 location hash test url 会更新 页面会定位到具有该 id 的元素 有没有办法阻止页面定位到该元素 Solution 您无法阻止这种行为 但您可以通过暂时隐藏目标来愚弄它 例如 像这样 与 jQuery 无
  • Firebase Auth - 最近登录多长时间

    我有一个个人资料选项卡 用户可以在其中按编辑并编辑他们的个人资料 我只想在必要时才需要他们的密码 所以想知道用户登录的时间是多少毫秒 这使得它不是最近登录 其中firebase会抛出错误 auth requires recent login
  • 使用 Jquery 附加链接

    我正在尝试根据您所在的页面添加指向我的页面的链接 我使用 Squarespace 来构建这个网站 因此对我来说最简单的方法是使用 Javascript 或 Jquery 我认为我缺少的这个语法有问题 我已经尝试用 来打破引号 但这不起作用
  • 如何以 Rails 方式处理 JavaScript 事件(例如“link_to :remote”)?

    我正在使用 Ruby on Rails 4 我想以 Rails 方式处理 JavaScript 事件 也就是说 例如 假设我有以下内容 link to destroy article path article method gt delet
  • 修复输入字段后,html5 oninvalid 不起作用

    我的表单中有这个输入代码
  • 什么是 Android 测试协调器?

    谷歌最近发布了Android测试支持库1 0 读完后overview https android developers googleblog com 2017 07 android testing support library 10 is
  • AngularJS:选择非 2 路绑定到模型

    我正在使用选择来显示客户名称 用户应该能够选择现有客户端 然后更新范围属性 控制器 初始化 首选 if scope clients length gt 0 scope existingClient scope clients 0 View
  • 如何解构 React props 并仍然访问其他 props?

    我很好奇如果我想要所有的 props 但也想要解构单个属性 那么组件的参数 props 是否可以像导入一样解构 我想这更像是一个 JavaScript 问题 而不是一个 React 问题 但是举个例子 import React useEff
  • jQuery 选择器定位具有 id AND class 的元素不起作用

    我有以下事件处理函数 jQuery document on click button submitb function e alert jQuery 包含在 html 文档中 但是 如果我点击 div class submitb Go di
  • Chrome JavaScript 日期构造函数获取 1884 年之前的日期似乎是错误的

    如果我将 1 1 1753 午夜 的 unix 毫秒时间戳值 6847786800000 传递给 Chrome 中的 JavaScript Date 构造函数 则 Chrome 给出的日期看起来非常奇怪 当我使用带有七个参数的 Date 构
  • 将字符串(是一个函数)转换回 Javascript 中的函数

    我在下面将此函数作为字符串 我如何将其转换回函数 我正在从 JQuery 事件中提取事件处理程序 我想将它们存储为字符串 然后将它们转换回来 因为它们将保存在 mySQL 中 function if GActiveClick return
  • 从 html5

    我正在寻找一种方法来根据用户代理字符串将控件属性添加到视频标签 我不希望在 iPad 和 Android 之外的任何浏览器或设备上出现控件属性 所以我认为用户代理是最好的识别方法 因为 ipad 和 android 一词出现在各自的 UA
  • 在 JQuery ui 自动完成中显示图像

    我有一个带有 JQuery ui 自动完成功能的脚本 可以完美运行 有一个显示用户名字和姓氏的搜索过程 但在我的数据库中 还有用户的图片 我想将其显示在带有名字和姓氏的建议中 数据库中pic包含图片url 剧本 function searc
  • 如何使用javascript从word文档页面中删除表格设计? Word js 插件

    我正在从表格 html 的 word 文档最后一页插入表格设计 我怎样才能删除它 这是我的代码 async function NewMap try await Word run async context gt html to word h
  • 在移动网站中处理 iPhone 事件(如向左滑动)

    iPhone 浏览器是否有可以使用 Javascript 挂钩的特殊事件 例如 如果用户向左滑动 我想执行某个操作 如果有类似的活动 很高兴看到所有这些活动的参考 理想情况下 有一天所有触摸屏移动浏览器都会有一个标准 您可以访问多点触控事件
  • 在 Chrome 中加载analytics.js时出现307重定向

    我正在构建一个网络应用程序并使用 Google Analytics analytics js 进行分析 我最近注意到 Chrome 中的分析功能无法正常工作 我使用单独模块中的标准代码片段加载分析并通过 requirejs 包含 我已验证该
  • 可选回调的 JavaScript 样式

    我有一些函数偶尔 并非总是 会收到回调并运行它 检查回调是否已定义 函数是一种好的风格还是有更好的方法 Example function save callback do stuff if typeof callback undefined
  • 元素不适应 Firefox 上的

    使用 ES6 ish D3js 模块运行 Angular 6 应用程序会导致 Firefox 出现问题 Chromium Chrome Safari 和 IE Edge 工作正常 伪代码看起来类似于 生产代码可以在下面找到
  • 在React组件中使用的字符串变量中插入html

    我正在为我的投资组合网站构建一个反应应用程序 目前我已经用 JSX 编写了应用程序 因此我可以添加以下内容 class Project extends React Component render return div h1 this pr
  • 什么是 TinyMCE jQuery 包?

    我被要求在项目中使用 TinyMCE 编辑器 在下载页面上 有一个主包 然后是一个 jQuery 包 This package contains special jQuery build of TinyMCE and a jQuery in

随机推荐

  • 对整数树求和 (Haskell)

    我正在尝试创建一个对非二叉整数树的值求和的函数 datastructures hs data Tree a Empty Node a Tree a deriving Eq Show myNums Num a gt Tree a myNums
  • 如何使基于列表的编辑器模板正确绑定到 POST 操作?

    我有一个模型 ApplicantBranchList 在更大的模型中用作属性 如下所示 Display Name Where would you want to work public ApplicantBranchList Prefere
  • 向 tm 结构添加一些间隔

    我有一个结构tm 我需要添加一些固定间隔 以xx年 xx月 xx天给出 到tm struct 有没有标准函数可以做到这一点 我使用的编译器是 Windows XP 上的 MSVC 2005 有两个转换时间格式的函数 mktime 哪个转换s
  • 组合选择器时,空格与没有空格的含义相同吗?

    在 CSS 中 选择器与空格的结合意味着后裔 http www w3 org TR CSS21 selector html descendant selectors 但在另一个答案中如何在CSS选择器中组合类和ID https stacko
  • phpStorm 与 php-cgi 的问题

    所以我最近换成了 ubuntu 我试图再次设置我的环境 我设法安装了 LAMP 和 phpmyadmin 和 phpstorm 但是我无法做的是从 phpStorm 运行 php 脚本 当我尝试运行该程序时 页面给我一个 502 Bad g
  • 从另一个页面链接到特定选项卡

    我有一个包含 3 个选项卡的表单 div class tabs ul class tabset li a class active span Shirts span a li li a href span Jeans span a li l
  • 带验证器的 Perl 工作流模块

    我正在尝试让 perl 工作流程模块工作 http search cpan org jonasbn Workflow http search cpan org jonasbn Workflow 我设法弄清楚它如何与工作流程 操作 条件等一起
  • 如何在 C++ 中对匿名对象使用运算符=?

    我有一个带有重载运算符的类 IPAddress IPAddress operator IPAddress other if this other delete data this gt init other getVersion other
  • 属性“dataSource”是必需的 java 中的错误(Spring)

    我正在开发一个网络应用程序Java 春季 我的java文件是这样的 try JdbcTemplate jt new JdbcTemplate dataSource System out println Connection jt toStr
  • getline 如何像使用 fgets 一样限制输入量

    GNU手册 https www gnu org software libc manual html node Line Input html 这段话来自 GNU 手册 警告 如果输入数据有空字符 您将无法辨别 所以 除非您知道数据不能包含空
  • 有什么理由仍然对数据库表和列使用蛇形命名法?

    当我开始数据库设计时 出于某种原因 建议您始终对表和列使用蛇形命名法 my table name 我认为在 MySQL 中尤其如此 原因是在某些情况下会丢失或强制使用大写 快进到今天 我看到很多人使用 Pascal Case MyTable
  • Windows 或 Linux 上的 Objective C

    我想学习 Objective C 但没有 Mac 如何在 Windows 或 Linux 上编译 obj c 我更喜欢 Windows 但 Linux 也可以 GCC 有一个 Objective C 编译器 您可能还想调查GNUStep h
  • 在 Maven/Java 项目中创建资源

    如何创建资源 使其位于我的项目的资源文件夹中 下面 test txt 是我要创建的文件 但变量 url为空 因此我无法获取要创建的文件的路径 URL url HashArray class getResource test txt File
  • 如何在C++中提取数字的数字?

    基本上我想做一个小程序 当你输入一个数字 比如145 时 它会读取3位数字并打印最大的一位 int a b c 最大值 cout lt lt Enter a b and c cin gt gt a gt gt b gt gt c max a
  • 如何使 python 进程以正确的进程名称运行?

    我在 Python 中有一些长期进程和临时进程 虽然 shell 和 C 程序以自己的名称运行 但所有 Python 进程都以 python filename py 运行 这使得识别进程变得困难 如何使 python 进程在 Linux 中
  • Angular:将curl 转换为Angular $http POST 请求

    我有这条卷曲线 curl X POST H content type application json H AUTH TOKEN vLC4grMuKbtbamJL3L6x localhost 8080 v1 segments appkey
  • 使用 NHibernate 查询

    我是 NHibernate 的新手 我正在尝试学习如何查询我的数据 下面是配置 xml 仅显示食谱 我希望能够通过输入的关键字按菜谱标题查询菜谱 还有成分名称中的成分 例如 您可以输入 意大利面酒 这是我尝试过的 但给了我一个错误 hql
  • 如何使用 c 中最少的库跟踪鼠标输入

    我不知道在哪里可以找到这些信息 但我想知道如何使用 c 中最少的非标准库来获取鼠标输入 或任何隐藏输入 基本上 c 中是否有相当于鼠标 和其他输入 输入的 stdio 或者是否有一个最小且在多个平台上交叉兼容的库 只需能够将鼠标坐标打印到终
  • 将对象添加到 NSMutableArray 属性

    这是我的数据结构 group 1 n id name elements 1 n 我为具有所有属性的元素定义一个类 为组定义一个类 如下所示 interface Group NSObject NSInteger groupID NSStrin
  • 如何通过模拟选择器和/或 redux 存储来编写 Redux Saga 测试

    Context 我是编写 Redux Saga 测试的新手 并且一直在使用反应样板 https github com react boilerplate开发一个应用程序 该应用程序使用 Jest 进行测试 样板文件非常模块化且复杂 我什至不