承诺解决后测试状态值

时间:2017-06-06 00:36:50

标签: unit-testing reactjs jestjs mobx mobx-react

给定一个登录的组件......

onSubmit(e) {
  e.preventDefault();
  const { userStore, data } = this.props;

  this.setState({isLogin: true});

  const promise = userStore.login(data);
  promise.then(() => {
    this.setState({isLogin: false});
  })
}

如何在解析承诺后创建一个验证isLogin状态是否为false的测试?

到目前为止,我有......

it('resolved submit should set isLogin to false', () => {
  mockApi.onPost('/authenticate').reply(200);

  const userStore = new UserStore();
  let fromPromiseLogin;
  userStore.login = jest.fn()
    .mockImplementationOnce((data) => {
        fromPromiseLogin = userStore.login(data);
        return fromPromiseLogin;
     });
  const wrapper = mount(
    <FormLogin userStore={userStore} />,
  );

  wrapper.find('form').simulate('submit');

  // HOW CAN I WAIT/OR CALLBACK FOR THE PROMISE ? I TRIED >
  whenWithTimeout(
    () => fromPromiseLogin && fromPromiseLogin.state !== PENDING,
    () => expect(wrapper.state().isLogin).toBeFalsy(),
  );

});

但是一个例外

  

[mobx]遇到一个由反应或观察者组件引发的未捕获异常,在:&#39;反应[当@ 21] TypeError:无法读取属性&#39; state&#39;未定义的

1 个答案:

答案 0 :(得分:0)

编辑: 问题编辑后,此答案不再适用。

您是否尝试使用here描述的.resolves函数测试承诺的结果?

expect(myPromise).resolves.toEqual('SomeValue');

或使用async/await

const result = await myPromise;
expect(result).toEqual('SomeValue');