在 Enzyme / React 测试中什么时候应该使用 render 和shallow?

2023-11-30

在发布这个问题之前,我尝试在 sqa stackexchange 中搜索,但我在那里没有找到关于浅层和渲染的帖子,所以我希望有人可以在这里帮助我。

在测试 React 组件时我什么时候应该使用shallow 和 render? 根据airbnb文档,我对两者的区别提出了一些看法:

  1. 由于浅层正在测试组件作为一个单位,所以它应该用于“父”组件。 (例如桌子、包装纸等)

  2. 渲染是针对子组件的。

我问这个问题的原因是我很难弄清楚我应该使用哪一个(尽管文档说它们非常相似)

那么,我如何知道在特定场景下使用哪一个呢?


根据酶docs:

mount(<Component />)完整 DOM 渲染非常适合您拥有可能与 DOM api 交互的组件,或者可能需要完整生命周期才能完全测试组件(即,componentDidMount 等)的用例。

vs.

shallow(<Component />)浅层渲染有助于限制您将组件作为一个单元进行测试,并确保您的测试不会间接断言子组件的行为。

vs.

render用于渲染反应组件静态HTML并分析生成的 HTML 结构。

您仍然可以在浅层渲染中看到底层“节点”,因此,例如,您可以使用以下示例(稍微做作)执行类似的操作AVA作为规范运行者:

let wrapper = shallow(<TagBox />);

const props = {
    toggleValue: sinon.spy()
};

test('it should render two top level nodes', t => {
    t.is(wrapper.children().length, 2);
});

test('it should safely set all props and still render two nodes', t => {
    wrapper.setProps({...props});
    t.is(wrapper.children().length, 2);
});

test('it should call toggleValue when an x class is clicked', t => {
    wrapper.setProps({...props});
    wrapper.find('.x').last().simulate('click');
    t.true(props.toggleValue.calledWith(3));
});

请注意渲染, 设置道具 and 寻找选择器乃至综合事件都是浅渲染支持的,所以大多数时候你可以直接使用它。

但是,您将无法获得组件的完整生命周期,因此如果您希望在 componentDidMount 中发生事情,您应该使用mount(<Component />);

本次测试使用Sinon监视组件的componentDidMount

test.only('mount calls componentDidMount', t => {

    class Test extends Component {
        constructor (props) {
            super(props);
        }
        componentDidMount() {
            console.log('componentDidMount!');
        }
        render () {
            return (
                <div />
            );
        }
    };

    const componentDidMount = sinon.spy(Test.prototype, 'componentDidMount');
    const wrapper = mount(<Test />);

    t.true(componentDidMount.calledOnce);

    componentDidMount.restore();
});

以上不会通过浅层渲染 or render

render只会为您提供 html,因此您仍然可以执行以下操作:

test.only('render works', t => {

    // insert Test component here...

    const rendered = render(<Test />);
    const len = rendered.find('div').length;
    t.is(len, 1);
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Enzyme / React 测试中什么时候应该使用 render 和shallow? 的相关文章

随机推荐

  • 用概念检查属性类型

    我想检查结构 类的属性是否符合我的概念需求 但编译器抱怨 Example struct N char value auto Get return value struct M int value auto Get return value
  • 动物园管理员合奏没有出现

    我正在尝试配置 3 个节点的集合文档 它们都在 Linux Ubuntu 上 在所有三个节点上 配置文件如下所示 ZOOKEEPER HOME conf 下的zoo cfg tickTime 2000 dataDir home zkuser
  • 如何使用 jest/react-testing-library 模拟 socket.io-client

    我正在构建一个聊天应用程序 并想使用编写集成测试react testing library并且不知道如何嘲笑socket io client s socket on socket emit etc 我尝试按照这个article并尝试使用模拟
  • PHP 在按钮单击时执行 Python 脚本

    我正在使用 php 有一个按钮刷新 python 脚本 这样做的目的是当存在某个输入并按下按钮时 运行 python 脚本 如果没有用户输入 则有一个默认值 input val 万一 我一直在尝试测试这个的方法是在我的 python 文件中
  • 将 div 动画至 100% 高度

    我试图将 div 动画化为其内容的 100 但它只是闪烁 而不是为 div 动画化 背景在动画结束时消失 我很困惑 因为当我输入高度数字而不是百分比时它会起作用 artbutton click function event event pr
  • Three.js - 将网格速度转换为网格旋转

    假设我有一个 Three js 网格和一个速度向量 3 速度在其他地方发生改变 然后每帧添加到网格位置 我想要的是 mesh rotation 与速度相对应 即网格是一个始终指向其前进方向的箭头 这是我尝试过的两种方法 使网格旋转 是的 但
  • 在Asp.net MVC4(Razor)中根据用户角色隐藏和显示Layout.cshtml的div标签

    我有一个母版页 其中有一些用于称为用户的角色的菜单 其他菜单用于管理员的角色 所以我愿意检查用户的角色 并显示一些 div 标签并隐藏其他标签用户角色的基础 因为 我们没有layout cshtml的控制器 所以我如何为布局视图设置view
  • windows上的openssl aes-256加密文件在linux上无法解密

    我有一个在 Windows apache 上运行的 php 文档存储库应用程序 该应用程序将使用以下命令对任何上传的文档进行 aes 加密 echo MyPass34 openssl exe aes 256 cbc pass stdin s
  • 为什么在 Android 中无法更改资源文件中字符串的颜色?

    tvName是TextView控件 World 的颜色改变了 但 Paul 的颜色没有改变 为什么 而且 在 Android Studio 3 1 3 中 我收到提示 fromHtml String Spanned 已弃用 在 Java 中
  • SendMessage 导致脚本挂起

    我遇到一个问题 SendMessage 函数导致脚本挂起 因此永远不会退出 尽管它正在像应有的那样运行 SendMessage 其任务已完成 无论如何 有没有办法解决这个问题 因为我很难从主脚本中删除它 Stop job name offm
  • 使用 opengles、android 播放视频

    如何在android中使用opengl es播放视频 你的问题有点模糊 如果您只想在 GL 表面上播放视频 这是可能的 请参阅Media Player示例代码戴夫在他的样本中提到的 您所要做的就是更换SurfaceView with a G
  • Jquery .autocomplete 不起作用

    我有一个 jquery 自动完成功能 它没有做任何事情 我已经使用了来自的代码here 它在他们的示例中有效 有一些变化 首先 数组是从 viewModelList 创建的并且它可以工作 这是其中的一小部分 var suburbs id 1
  • 如何检测从不同位置多次登录 Django Web 应用程序?

    我想一次只允许一个经过身份验证的会话在我的 Django 应用程序中进行单独登录 因此 如果用户在给定的 IP 地址上登录网页 并且使用相同的用户凭据从不同的 IP 地址登录 我想做一些事情 注销第一个用户或拒绝第二个用户的访问 不确定是否
  • swift alamofire 返回值为空

    你好我有以下方法 func getAlamoPlayers gt Player Get TeamID let prefs NSUserDefaults NSUserDefaults standardUserDefaults var Team
  • 如何回滚文件 git vscode 以前的历史记录?

    如何在vscode中重新加载git源代码管理中文件的先前历史记录 vs code 只提供恢复最后一次提交的功能 我可以在 vscode 中看到带有 Git History 扩展名的文件的所有历史记录 但是有没有办法回滚到文件的任何历史记录
  • 如何在 Java 中将示例 JSON 转换为 JSON 模式

    我想将 json 文档转换为 json 模式 我用谷歌搜索了它 但没有根据我的要求得到确切的想法 这是 JSON empId 1001 firstName jonh lastName Springer title Engineer addr
  • gdb 调试器中未找到调试符号

    当我运行复杂的 C 程序模拟器 c 其中包含 gdb 中的许多 C 文件 时 它会给出错误 找不到调试符号 我正在使用 gcc g Simulator c 来编译这个程序 任何人都可以告诉我为什么会出现这个错误 您可能需要编译each c
  • Vue实例之间如何通信

    如果我定义一个组件 例如 Vue component hello name hello data gt return color black template div div TEST div div
  • 通过 NuGet 提供 App.config 文件

    我的 nupkg 中有一些信息 我想将其包含在消费者的应用程序中 使用 nupkg 时直接包含部分 app config 的最佳方法是什么 我目前已经这样做了 mypackage nupkg content 应用程序配置 但这使得它想要覆盖
  • 在 Enzyme / React 测试中什么时候应该使用 render 和shallow?

    在发布这个问题之前 我尝试在 sqa stackexchange 中搜索 但我在那里没有找到关于浅层和渲染的帖子 所以我希望有人可以在这里帮助我 在测试 React 组件时我什么时候应该使用shallow 和 render 根据airbnb