source

농담에서 모의 던지기 오류를 적절하게 만드는 방법은?

manysource 2023. 10. 12. 23:21

농담에서 모의 던지기 오류를 적절하게 만드는 방법은?

Jest를 이용하여 GraphQL api를 테스트하고 있습니다.

각 쿼리/뮤테이션마다 별도의 테스트 수트를 사용하고 있습니다.

저는 하나의 기능(즉, Meteor's)을 조롱하는 2개의 테스트(각각 별도의 테스트복을 입고)가 있습니다.callMethod돌연변이에 사용됩니다.

  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)알겠습니다.

{ data: { forgotPassword: true } }

이 행동은 내가 원하는 것이 아닙니다 왜냐하면.mockReturnValue나는 오류를 던지고 따라서 예상합니다.result오류 개체를 가지다

그러나 이 테스트 전에 다른 테스트를 실행합니다.

 it('should throw an error if wrong credentials were provided', async () => {
    callMethod
      .mockReturnValue(new Error('cannot login'))
      .mockName('callMethod');

그리고 잘 작동하고, 오류는 던져집니다.

시험이 끝난 후에 모의고사가 리셋되지 않는 것이 문제인 것 같습니다.나의jest.conf.js있습니다clearMocks: true

각 테스트복은 별도의 파일로 되어 있으며, 다음과 같은 테스트 전에 기능을 모의 실험합니다.

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모든 것이 예상대로 잘 풀렸습니다.

callMethod.mockImplementation(() => {
  throw new Error('User not found');
});

하지만 그것이 왜 또 다른 검사에서.mockReturnValue잘 작동합니다...

바꾸다.mockReturnValue와 함께.mockImplementation:

    yourMockInstance.mockImplementation(() => {
      throw new Error();
    });

당신이 주장하고 싶은 경우에는

   test('the fetch fails with an error', () => {
     return expect(fetchData()).rejects.toMatch('error');
   });

약속이라면 할 수도 있습니다. rejects www.jestjs.io/docs/en/asynchronous#resolves--rejects

약속은 https://jestjs.io/docs/mock-function-api#mockfnmockrejectedvaluevalue 을 사용할 수 있습니다.

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 을 사용할 수 있습니다.

const func = () => {
  throw new Error('my error')
}
it('should throw an error', () => {
    expect(func).toThrow()
})

각도 + 재스트의 경우:

import { throwError } from 'rxjs';

yourMockInstance.mockImplementation(() => {
  return throwError(new Error('my error message'));
});

꼭 덧붙입니다throw new Error('Network error or something')둘 중 하나에catch차단 또는 조건부로

import fetchApi from '../src'

it("should throw error", async () => {
    const errorMessage: string = "Network Error";
    
    (axios.post as jest.Mock).mockRejectedValueOnce(new Error(errorMessage));
    
    expect(async () => await fetchApi()).rejects.toThrow(
          errorMessage
    );
});

언급URL : https://stackoverflow.com/questions/49835264/how-to-properly-make-mock-throw-an-error-in-jest