Reactjs 如何使用玩笑正确测试拒绝的承诺? 代码 试验

Reactjs 如何使用玩笑正确测试拒绝的承诺? 代码 试验,reactjs,promise,mocking,jestjs,enzyme,Reactjs,Promise,Mocking,Jestjs,Enzyme,测试确实强制代码进入方法中的捕获。因此,状态设置为“error” 但在我的测试中,它并没有达到我期望的效果,而是等待承诺被拒绝,然后再测试状态变化。 我不确定在这里尝试什么,我应该使用async/await吗 因此,我想等待的是createUser方法,但我不确定我的实现是否允许这样做。在您的代码中handleFormSubmit函数应该返回您可以在测试中等待的承诺。此外,您还需要从成功和错误回调中返回真实数据,以分别解决和拒绝承诺 export const createUser = funct

测试确实强制代码进入方法中的捕获。因此,状态设置为“error”

但在我的测试中,它并没有达到我期望的效果,而是等待承诺被拒绝,然后再测试状态变化。 我不确定在这里尝试什么,我应该使用async/await吗


因此,我想等待的是
createUser
方法,但我不确定我的实现是否允许这样做。

在您的代码中
handleFormSubmit
函数应该返回您可以在测试中等待的承诺。此外,您还需要从成功和错误回调中返回真实数据,以分别解决和拒绝承诺

export const createUser = function() {
  return new Promise((resolve, reject) => {
    reject('error');
  });
};
在实际代码中,您在
catch
处理程序中捕获了错误,并试图在测试用例代码中进一步捕获它。因此,
catch
无法进一步链接,而您可以多次链接
then

请参阅承诺文件:
您的代码看起来是正确的。你为什么说它不等待承诺被拒绝?我唯一能做的不同就是利用Jest的模仿功能,所以改变一下

嘲弄 到

试验
不需要单独的模拟文件,测试失败是因为它不知道主题是异步的。可以通过使用
done
param或使测试功能
async
来修复此问题

注意,还需要设置预期断言的数量,这样即使没有执行catch分支,测试也会失败

异步
/
等待
样式:

jest.mock('../services');
const services = require('../services');

const createUser = jest.spyOn(services, "createUser");
createUser.mockRejectedValue("error");

...

it('rejects...', () => {


您应该这样做:

it('拒绝…',()=>{
const Container=createUserContainer(CreateUser);
常量包装器=浅();
返回expect(wrapper.instance().handleFormSubmit()).rejects.toEqual('error');
});

我认为这样比较干净。您可以看到这种方法。

这并没有解决问题。代码仍然会被捕获,但是测试在运行expectsMy bad之前仍然不会等待承诺实现,它已经用文档链接更新了答案。这肯定会解决你的问题的。。你是如何解决这个问题的?我有相同的代码,需要在承诺完成后进行测试。仅供参考,您不应拒绝字符串。您应该拒绝错误,如
拒绝(新错误('error'))
。注意,您的测试也可以确认该状态。加载仍然设置为true如果测试的目标代码需要使用“新服务”,那么您需要使用requireActual执行jest.doMock,并只覆盖单个函数?这对我非常有帮助。“.catch”风格正是我所需要的。谢谢如果函数没有抛出,这个测试不会给出假阳性吗?@oyalhi不,它不会给出假阳性。行
expect.assertions(1)
告诉jest将有一个断言,因此如果没有触发
catch
,jest将抱怨缺少断言这是检查异步错误的官方方法。这应该是公认的答案。谢谢你的更正。有两种方法可以做到这一点。我在缺少的断言中添加了
return
。但您也可以使用async和Wait来完成。你可以在官方文件中阅读
export const createUser = function() {
  return new Promise((resolve, reject) => {
    reject('error');
  });
};
handleFormSubmit = () => {  
  this.setState({ loading: true });
  return createUser()
    .then(() => {
      this.setState({
        loading: false,
      });
      return true;
    })
    .catch(e => {
       this.setState({
         error: e,
       });
       throw e;
    });
};
export const createUser = function() {
  return new Promise((resolve, reject) => {
    reject('error');
  });
};
jest.mock('../services');
const services = require('../services');

const createUser = jest.spyOn(services, "createUser");
createUser.mockRejectedValue("error");

...

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

    await wrapper.instance().handleFormSubmit()
      .catch(e => {
         console.log("State: ", wrapper.state());
         expect(e).toEqual('error');
      });
 });
 it('rejects...', done => {
    expect.assertions(1);
    const Container = createUserContainer(CreateUser);
    const wrapper = shallow(<Container />);  

    wrapper.instance().handleFormSubmit()
      .catch(e => {
         console.log("State: ", wrapper.state());
         expect(e).toEqual('error');
         done();
      });
 });