小编cod*_*123的帖子

如何使用 Jest 正确测试被拒绝的承诺?

代码

import { createUser } from '../services';
...
...

handleFormSubmit = () => {  
  this.setState({ loading: true });
  createUser()
    .then(() => {
      this.setState({
        loading: false,
      });
    })
    .catch(e => {
       this.setState({
         error: e,
       });
    });
};
Run Code Online (Sandbox Code Playgroud)

测试

 it('rejects...', () => {
    const Container = createUserContainer(CreateUser);
    const wrapper = shallow(<Container />);  

    return wrapper.instance().handleFormSubmit()
      .catch(e => {
         console.log("State: ", wrapper.state());
         expect(e).toEqual('error');
      });
 });
Run Code Online (Sandbox Code Playgroud)

嘲笑

export const createUser = function() {
  return new Promise((resolve, reject) => {
    reject('error');
  });
};
Run Code Online (Sandbox Code Playgroud)

测试确实强制代码进入方法中的捕获。所以状态确实被设置为“错误”。

但是在我的测试中,它没有按照我的预期进行操作,而是在测试状态更改之前等待 Promise …

mocking promise reactjs jestjs enzyme

27
推荐指数
3
解决办法
3万
查看次数

如何使用 Jest 模拟第三方包?

我希望能够测试这个Swal()函数是否被调用。

它被嘲笑,但我不熟悉 Jest 嘲笑库。

这是我的测试设置文件中:

jest.mock('sweetalert2', () => {
  return {
    Swal: () => {},
  };
});
Run Code Online (Sandbox Code Playgroud)

所以我只想返回一个函数。

在我的组件中,Swal 的调用方式如下:

doSomething = () => {
  Swal({
    title: 'Could not log in',
    text: error.message,
    type: 'error',
  });
};
Run Code Online (Sandbox Code Playgroud)

我认为我的模拟需要返回一个命名方法,因此我可以监视它并检查它是否被调用。

我的测试:

import Swal from 'sweetalert2';

describe('Login Container', () => {
  it('calls Swal', () => {
    doSomething();
    var swalSpy = jest.spyOn(Swal, 'Swal');
    expect(swalSpy).toHaveBeenCalled();
  });
});
Run Code Online (Sandbox Code Playgroud)

错误:

expect(jest.fn()).tohavebeencalled();
Run Code Online (Sandbox Code Playgroud)

当测试失败时,我应该如何设置我的模拟和间谍

javascript mocking reactjs jestjs enzyme

5
推荐指数
1
解决办法
4668
查看次数

标签 统计

enzyme ×2

jestjs ×2

mocking ×2

reactjs ×2

javascript ×1

promise ×1