gpt4 book ai didi

reactjs - enzyme /Mocha : How to test a react component function by firing an onChange event from a child component

转载 作者:行者123 更新时间:2023-12-03 13:59:02 25 4
gpt4 key购买 nike

我正在使用 enzyme /Mocha 来测试我的 react 组件。

我有一个正在测试的父组件。

let wrapper = mount(<Parent />);

并且这个父组件在它的渲染函数中有一个子组件

render: function() {
<Child onChange={this.foo} />
},
foo: function() {
console.log("I was called");
}

我希望触发 child 的 onChange 函数,以便我可以测试 parent 的 foo 函数。

到目前为止,我还没有找到办法做到这一点 - 我读过有关 sinon 和 stub 的内容,但这主要是关于拦截函数而不是触发它们。

下面的测试

shallow(<Parent />).instance().foo();

是一个弱测试,因为它不会测试连接我的 child 和 parent 的代码行,并且如果我没有为我的 child 编写单元测试,它也不会测试 child 的 onChange 功能。恕我直言 - 如果将我的组件分解给 parent / child 意味着可测试性降低 - 那么这个框架就有问题

任何帮助将不胜感激,谢谢

最佳答案

这是我在很多测试中所做的事情。我发现最适合我的方法是手动调用子组件的 onChange 处理程序,并根据您期望结果发生的行为进行断言。

假设您有一个如下所示的父组件:

import React from 'react';
import Child from './child';

export default class extends React.Component {
render() {
return (
<div>
<Child onChange={this.foo} />
</div>
);
}

foo() {
console.log('bar');
}
}

传递给子进程的 onChange 属性将在调用时记录字符串“bar”。这是我们想要测试的行为。为此,我们需要采取以下步骤:

  1. 使用您选择的模拟库进行 stub console.log(本例中我将使用Sinon)

  2. 创建父组件的浅层实例,并获取对其子组件的引用。

  3. 手动调用 Child 的 onChange 属性。

  4. 断言 console.log 被调用一次,并且带有一个参数:'bar'

这是我的做法(使用 Mocha 和柴):

import Foo from './foo';

import React from 'react';
import {shallow} from 'enzyme';

import sinon from 'sinon';
import sinonChai from 'sinon-chai';
import chai, {expect} from 'chai';

describe('Foo', () => {
let renderedElement;

function renderComponent() {
const componentElement = React.createElement(Foo);

renderedElement = shallow(componentElement);
}

before(() => {
chai.use(sinonChai);
});

it('should log the string "bar" when the child component is changed', () => {
//step 1
sinon.stub(console, 'log');

//step 2
renderComponent();
const childComponent = renderedElement.props().children;

//step 3
childComponent.props.onChange();

//step 4
expect(console.log).to.have.callCount(1);
expect(console.log).to.be.calledWith('bar');

//clean up
console.log.restore();
});
});

我喜欢这种方法的原因是因为它测试组件行为,而不是简单地测试它是否被传递为恰好等于另一个函数的函数。

关于reactjs - enzyme /Mocha : How to test a react component function by firing an onChange event from a child component,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38321093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com