簡體   English   中英

測試 React 表單組件

[英]Testing React form components

在我的類似教程的應用程序中,我有一個AddForm組件:

var React = require('react');
var Input = require('react-bootstrap').Input;
var TeamActions = require('../actions/team_actions.js');

var AddForm = React.createClass({
  handleFormSubmit: function(e) {
    e.preventDefault();

    var name = this._trimmedValue(this.refs.name);
    var rating = this._trimmedValue(this.refs.rating);

    if (name && rating) {
      TeamActions.addTeam(
        {name: name, rating: rating}
      );
      this._clearField(this.refs.name);
      this._clearField(this.refs.rating);
    }
  },

  _trimmedValue: function(field) {
    return field.getInputDOMNode().value.trim();
  },

  _clearField: function(field) {
    field.getInputDOMNode().value = '';
  },

  render: function() {
    return (
        <form onSubmit={this.handleFormSubmit}>
          <Input label="Name" type="text" placeholder="Name" ref="name" />
          <Input label="Rating" type="text" placeholder="Rating" ref="rating" />
          <Input bsStyle="primary" type="submit" value="Add!" />
        </form>
    );
  }
})

module.exports = AddForm;

團隊行動:

var McFly = require('mcfly');
var Flux = new McFly();
var TeamConstants = require('../constants/team_constants.js');


var TeamActions = Flux.createActions({
  addTeam: function(team) {
    return {
      actionType: TeamConstants.ADD_TEAM,
      team: team
    }
  }
});

module.exports = TeamActions;

如您所見,我在這里使用 McFly 和 React-Bootstrap。

現在我想用玩笑來測試它。

我想要以下測試用例:

1)如果有人試圖提交一個帶有空輸入的表單,什么都不應該發生(更具體地說 - TeamActions 模擬應該沒有交互)

2) 如果提交了具有有效名稱和評級的表單,則應該正確調用 TeamActions 模擬

3) 如果提交具有有效名稱和評級的表單,則應清除名稱和評級輸入。

我該如何測試? 我應該使用 react 的 TestUtils 以某種方式訪問​​ DOM 嗎?

我應該以某種方式模擬表單提交嗎? 如果是這樣,我該怎么做?

最后一件事 - 我的 AddForm 依賴於 TeamActions。 通過寫作:

jest.dontMock('../add_form.js');

jest 指示要模擬所有這些依賴項(react、react-bootstrap、team_actions)還是我應該以某種方式自己模擬 TeamActions?

// 編輯:

因為有人說我在一個主題上問了太多問題,更具體地說:

如何使用 TestUtils 模擬具有特定負載的表單提交? 我需要自己模擬 TeamActions 還是自動為我模擬?

React TestUtils 允許你模擬表單提交:

var addForm = TestUtils.renderIntoDocument(AddForm(null));
var form = TestUtils.findRenderedDOMComponentWithTag(addForm, 'form');
TestUtils.Simulate.submit(form);

我測試操作的方法是手動addTeam 在模擬測試中的任何內容之前,請執行以下操作:

var TeamActions = require('../actions/team_actions');
TeamActions.addTeam = jest.genMockFn();
/* then simulate submission... */
expect(TeamActions.addTeam).toBeCalledWith({name: 'name', rating: 'rating'});

要測試輸入值,只需使用 refs。

addForm.refs.name.getDOMNode().value = 'Some Name';
/* perform some action that should clear input */
expect(addForm.refs.name.getDOMNode().value).toEqual('');

編輯

要回答您編輯的問題,您似乎實際上不需要手動模擬addTeam 我剛剛嘗試了一下,似乎 Jest 想出了如何模擬 McFly 操作的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM