首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Jest中正确地进行模拟抛出错误?

如何在Jest中正确地进行模拟抛出错误?
EN

Stack Overflow用户
提问于 2018-04-14 19:18:25
回答 3查看 185.9K关注 0票数 168

我正在使用Jest测试我的GraphQL api。

我正在为每一个查询/变异使用单独的测试服

我有两个测试(每个测试用在单独的测试服中),其中我模拟了一个用于突变的函数(即Meteor的callMethod)。

代码语言:javascript
复制
  it('should throw error if email not found', async () => {
    callMethod
      .mockReturnValue(new Error('User not found [403]'))
      .mockName('callMethod');

    const query = FORGOT_PASSWORD_MUTATION;
    const params = { email: 'user@example.com' };

    const result = await simulateQuery({ query, params });

    console.log(result);

    // test logic
    expect(callMethod).toBeCalledWith({}, 'forgotPassword', {
      email: 'user@example.com',
    });

    // test resolvers
  });

当我console.log(result)我得到

代码语言:javascript
复制
{ data: { forgotPassword: true } }

这种行为不是我想要的,因为在.mockReturnValue中,我抛出一个错误,因此期望result有一个错误对象

但是,在此测试之前,将运行另一个

代码语言:javascript
复制
 it('should throw an error if wrong credentials were provided', async () => {
    callMethod
      .mockReturnValue(new Error('cannot login'))
      .mockName('callMethod');

它运行良好,会抛出错误。

我想问题是模拟测试结束后不会被重置。在我的jest.conf.js里我有clearMocks: true

每个测试套件都位于一个单独的文件中,我在测试之前模拟函数,如下所示:

代码语言:javascript
复制
import simulateQuery from '../../../helpers/simulate-query';

import callMethod from '../../../../imports/api/users/functions/auth/helpers/call-accounts-method';

import LOGIN_WITH_PASSWORD_MUTATION from './mutations/login-with-password';

jest.mock(
  '../../../../imports/api/users/functions/auth/helpers/call-accounts-method'
);

describe('loginWithPassword mutation', function() {
...

更新

当我用.mockReturnValue代替.mockImplementation时,一切都如期而至:

代码语言:javascript
复制
callMethod.mockImplementation(() => {
  throw new Error('User not found');
});

但这并不能解释为什么在另一个测试中.mockReturnValue运行良好.

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-02 11:57:56

.mockReturnValue更改.mockImplementation

代码语言:javascript
复制
    yourMockInstance.mockImplementation(() => {
      throw new Error();
    });

如果你想断言

代码语言:javascript
复制
   test('the fetch fails with an error', () => {
     return expect(fetchData()).rejects.toMatch('error');
   });

如果这是你对.rejects www.jestjs.io/docs/en/asynchronous#resolves--rejects的承诺

票数 293
EN

Stack Overflow用户

发布于 2021-07-29 18:59:17

对于承诺,可以使用https://jestjs.io/docs/mock-function-api#mockfnmockrejectedvaluevalue

代码语言:javascript
复制
test('async test', async () => {
  const asyncMock = jest.fn().mockRejectedValue(new Error('Async error'));

  await asyncMock(); // throws "Async error"
});

若要测试是否引发错误,可以使用https://eloquentcode.com/expect-a-function-to-throw-an-exception-in-jest

代码语言:javascript
复制
const func = () => {
  throw new Error('my error')
}
it('should throw an error', () => {
    expect(func).toThrow()
})
票数 30
EN

Stack Overflow用户

发布于 2020-04-02 16:14:43

角+ Jest:

代码语言:javascript
复制
import { throwError } from 'rxjs';

yourMockInstance.mockImplementation(() => {
  return throwError(new Error('my error message'));
});
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49835264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档