使用Enzyme和Sinon调用了React组件上的测试自定义方法

时间:2016-10-01 16:39:17

标签: reactjs mocha enzyme should.js

我想检查一下,当我的组件上单击一个按钮时,它会调用我创建的方法来处理点击。这是我的组成部分:

import React, { PropTypes, Component } from 'react';

class Search extends Component {

  constructor(){
    super();
    this.state = { inputValue: '' };
  }

  handleChange = (e) => {
    this.setState({ inputValue: e.target.value });
  }

  handleSubmit = (e) => {
    e.preventDefault();
    return this.state.inputValue;
  }

  getValue = () => {
    return this.state.inputValue;
  }

  render(){
    return (
      <form>
        <label htmlFor="search">Search stuff:</label>
        <input id="search" type="text" value={this.state.inputValue} onChange={this.handleChange} placeholder="Stuff" />
        <button onClick={this.handleSubmit}>Search</button>
      </form>
    );
  }
}

export default Search;

这是我的测试

  import React from 'react';
  import { mount, shallow } from 'enzyme';
  import Search from './index';
  import sinon from 'sinon';

  describe('Search button', () => {

    it('calls handleSubmit', () => {
      const shallowWrapper = shallow(<Search />);
      const stub = sinon.stub(shallowWrapper.instance(), 'handleSubmit');
      shallowWrapper.find('button').simulate('click', { preventDefault() {}     });
      stub.called.should.be.true();
    });

  });

称为属性的调用返回false。我已经尝试了很多关于语法的变化,我想也许我只是缺少一些基本的东西。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:10)

我对诗乃也相对较新。我一般都将spy()传递给组件道具,然后检查它们(虽然你可以用同样的方式使用stub()):

let methodSpy = sinon.spy(),
  wrapper = shallow(<MyComponent someMethod={methodSpy} />)

wrapper.find('button').simulate('click')

methodSpy.called.should.equal(true)

我指出这一点是因为我认为这是单元测试组件最简单的方法(测试内部方法can be problematic)。

在您的示例中,您尝试测试组件的内部方法,这不起作用。我遇到了this issue,这应该会帮助你。尝试:

it('calls handleSubmit', () => {
  const shallowWrapper = shallow(<Search />)
  let compInstance = shallowWrapper.instance()

  let handleSubmitStub = sinon.stub(compInstance, 'handleSubmit');
  // Force the component and wrapper to update so that the stub is used
  compInstance.forceUpdate()
  shallowWrapper.update()

  shallowWrapper.find('button').simulate('click', { preventDefault() {} });

  handleSubmitStub.called.should.be.true();
});