ReactJS测试sinon spy模拟函数返回一个函数而不是布尔值

时间:2018-12-06 03:04:05

标签: reactjs unit-testing enzyme sinon

我试图检查我的formIsValid组件中的InformationGatheringFormContainer方法在执行时是否正在调用组件props之一(isInfoFormValid):

export class InformationGatheringFormContainer extends React.Component{
...
formIsValid() {
    this.props.isInfoFormValid(this.state.invalid);
}

为此,我正在使用sinon间谍功能:

it('formIsValid changes the state', () => {
    const mockFunction = sinon.spy();

    const baseProps = {
        isInfoFormValid: mockFunction,
    }

    const wrapper = shallow(<InformationGatheringFormContainer {...baseProps} />);
    wrapper.instance().formIsValid();
    expect(mockFunction).to.have.been.calledOnce.equal(true);

})

我希望它能工作,但是此测试给出了:

AssertionError: expect(received).to.equal(expected)

Expected value to equal:
  true
Received:
  [Function proxy]

Difference:

  Comparing two different types of values. Expected boolean but received function.

因此确实检测到了函数调用,但是.to.have.been.calledOnce酶方法显然没有在此处返回布尔值。

我是Reactjs单元测试的新手,我有点迷茫。 .to.have.been.calledOnce的返回值与布尔值如何具有不同的类型?

预先感谢您的帮助

2 个答案:

答案 0 :(得分:0)

看起来像calledOnce is a sinon spy property,而不是jest's expect。 因此,类似:

expect(mockFunction.calledOnce).toEqual(true);

应该可以工作(如果您更喜欢sinon)。

值得注意的是jest has his own mocking mechanism

it('formIsValid changes the state', () => {
    const isInfoFormValid = jest.fn();

    const baseProps = {
        isInfoFormValid,
    }

    const wrapper = shallow(<InformationGatheringFormContainer {...baseProps} />);
    wrapper.instance().formIsValid();
    expect(isInfoFormValid).toHaveBeenCalledTimes(1);

})

答案 1 :(得分:0)

我还找到了另一种方法:

expect(mockFunction.callCount).toEqual(1);