在使用jest测试组件时,Promise不会在react组件中工作

时间:2016-04-12 13:16:16

标签: testing reactjs promise jestjs

美好的一天。我有以下问题: 我有一个项目编辑器。 工作原理:我推动添加'按钮,填写一些信息,点击“保存”。按钮。 我的react组件中的_onSaveClicked函数处理来自服务的click事件和调用函数,它从编辑表单向服务器发送params并返回promise。 _onSaveClicked实现

.then(response => {
    console.log('I\'m in then() block.');
    console.log('response', response.data);
}) 

功能并等待承诺结果。它适用于实际情况。 我创建了假服务并将其放置而不是真正的服务。 服务的功能包括:

return Promise.resolve({data: 'test response'});

正如你所看到的假服务返回已解决的承诺和.then()块应该立即工作。但是.then()块永远不会起作用。

Jest测试:

jest.autoMockOff();

const React = require('react');
const ReactDOM = require('react-dom');
const TestUtils = require('react-addons-test-utils');
const expect = require('expect');
const TestService = require('./service/TestService ').default;


let testService = new TestService ();

describe('TestComponent', () => {
  it('correct test component', () => {
    //... some initial code here
    let saveButton = TestUtils.findRenderedDOMComponentWithClass(editForm, 'btn-primary');
    TestUtils.Simulate.click(saveButton);
    // here I should see response in my console, but I don't
  });
});

React组件保存功能:

 _onSaveClicked = (data) => {
    this.context.testService.saveData(data)
      .then(response => {
        console.log('I\'m in then() block.');
        console.log('response', response.data);
      });
  };

服务:

export default class TestService {
  saveData = (data) => {
    console.log('I\'m in services saveData function');
    return Promise.resolve({data: data});
  };
}

我只看到"我在服务中保存了数据功能"在我的控制台中。

如何使它有效?我需要模仿服务器响应。

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

您可以将测试组件包装在另一个组件中,如:

class ContextInitContainer extends React.Component {

  static childContextTypes = {
    testService: React.PropTypes.object
  };

  getChildContext = () => {
    return {
      testService: {
        saveData: (data) => {
          return {
            then: function(callback) {
              return callback({
                // here should be your response body object
              })
            }
          }
        }
      }
    };
  };

  render() {
    return this.props.children;
  }
}

然后:

<ContextInitContainer>
  <YourTestingComponent />
</ContextInitContainer>

所以你的承诺将立即执行。