当前位置: 首页 > 面试题库 >

如何使用浅渲染测试装饰的React组件

惠野
2023-03-14
问题内容

我正在遵循此教程:http : //reactkungfu.com/2015/07/approaches-to-testing-
react-components-an-overview/

尝试学习“浅渲染”的工作原理。

我有一个更高阶的组件:

import React from 'react';

function withMUI(ComposedComponent) {
  return class withMUI {
    render() {
      return <ComposedComponent {...this.props}/>;
    }
  };
}

和一个组件:

@withMUI
class PlayerProfile extends React.Component {
  render() {
    const { name, avatar } = this.props;
    return (
      <div className="player-profile">
        <div className='profile-name'>{name}</div>
        <div>
          <Avatar src={avatar}/>
        </div>
      </div>
    );
  }
}

和一个测试:

describe('PlayerProfile component - testing with shallow rendering', () => {
  beforeEach(function() {
   let {TestUtils} = React.addons;

    this.TestUtils = TestUtils;

    this.renderer = TestUtils.createRenderer();
    this.renderer.render(<PlayerProfile name='user'
                                            avatar='avatar'/>);
  });

  it('renders an Avatar', function() {
    let result = this.renderer.getRenderOutput();
    console.log(result);
    expect(result.type).to.equal(PlayerProfile);
  });
});

result变量保存this.renderer.getRenderOutput()

在本教程中,result.type测试如下:

expect(result.type).toEqual('div');

就我而言,如果我登录,result它是:

LOG: Object{type: function PlayerProfile() {..}, .. }

所以我像这样更改了测试:

expect(result.type).toEqual(PlayerProfile)

现在它给了我这个错误:

Assertion Error: expected [Function: PlayerProfile] to equal [Function: withMUI]

所以PlayerProfile类型是高阶函数withMUI

PlayerProfile``withMUI使用浅色渲染装饰,仅PlayerProfile组件被渲染,而不是子组件。因此,我假定浅层渲染不适用于装饰的组件。

我的问题是:

为什么在本教程中为什么result.type应该是div,但在我看来不是。

如何使用浅层渲染测试用高阶组件装饰的React组件?


问题答案:

你不能 首先,让我们稍微对装饰器进行除糖:

let PlayerProfile = withMUI(
    class PlayerProfile extends React.Component {
      // ...
    }
);

withMUI返回一个不同的类,因此PlayerProfile类仅存在于withMUI的闭包中。

这是一个简化的版本:

var withMUI = function(arg){ return null };
var PlayerProfile = withMUI({functionIWantToTest: ...});

您将值传递给函数,它不会返回值,您没有值。

解决方案?保持对它的引用。

// no decorator here
class PlayerProfile extends React.Component {
  // ...
}

然后,我们可以导出组件的包装版本和未包装版本:

// this must be after the class is declared, unfortunately
export default withMUI(PlayerProfile);
export let undecorated = PlayerProfile;

使用此组件的普通代码不会更改,但是您的测试将使用以下代码:

import {undecorated as PlayerProfile} from '../src/PlayerProfile';

另一种html" target="_blank">方法是将withMUI函数模拟为(x) => x(标识函数)。这可能会导致怪异的副作用,需要在测试方面进行,因此当添加装饰器时,您的测试和源可能会不同步。

这里不使用装饰器似乎是安全的选择。



 类似资料:
  • 嗨,我是新来的反应本机和尝试渲染组件调用一个函数内渲染,但它似乎不工作。 我的职能: 如果我这样做,效果会更好: 但不是这个: 我不明白为什么第二个代码不起作用

  • 问题内容: 我有一个要显示字符串数组的组件。代码看起来像这样。 运行正常。例如,如果 props.data = [‘tom’,’jason’,’chris’] 页面中呈现的结果将为 tomjasonchris 然后,我想使用逗号连接所有名称,因此我将代码更改为 但是,渲染的结果是 [Object],[Object],[Object]。 我不知道如何解释对象成为要渲染的反应组件。有什么建议吗? 问题

  • 问题内容: 我有一个功能组件,我想强迫它重新渲染。 我该怎么办? 由于没有实例,因此我无法致电。 问题答案: 现在,使用react挂钩,您可以调用函数组件。 将返回由2个元素组成的数组: 1.一个值,表示当前状态。 2.它的二传手。用它来更新值。 通过设置器更新值将迫使您的功能组件重新呈现 , 就像这样做: 您可以在此处找到演示。 上面的组件使用了自定义的钩子函数(),该函数使用了布尔状态钩子()

  • 问题内容: 在React JSX中,似乎无法执行以下操作: 我收到一个解析错误:意外令牌{。这不是React可以处理的吗? 我正在设计此组件,以便在内部隐藏的值将包含有效的HTML元素(h1,p等)。有什么办法可以使这项工作吗? 问题答案: 您不应该将组件子弹放在花括号中: 这是一个有效的小提琴:http : //jsfiddle.net/kb3gN/6668/ 此外,您还可以找到JSX编译器,有

  • 问题内容: 我有一个React组件,其中有许多子组件。我不希望立即渲染子组件,而是要经过一段时间的延迟(对于每个子组件而言,它们是统一的还是不同的)。 我想知道-有没有办法做到这一点? 问题答案: 我认为最直观的方法是给孩子一个“ wait” ,在从父代传递过来的持续时间内隐藏该组件。通过将默认状态设置为隐藏,React仍会立即渲染组件,但是直到状态更改后它才可见。然后,您可以设置为调用一个函数,

  • 问题内容: 你能告诉我如何在react js中渲染列表吗?我喜欢这样 问题答案: 您可以通过两种方式进行操作: 第一: 第二: 直接在返回中编写map函数