오류로 인해 Jest로 포스트 메소드를 테스트 할 수 없습니다 .mock을 읽을 수 없습니다.


9

API를 호출하는 다른 방법이있는 API 서비스가 있습니다. 모든 GET 요청을 성공적으로 테스트했지만 POST 요청을 테스트하는 데 문제가 있습니다.

이것이 방법입니다.

export default class ApiService {
  static makeApiCall = <T>(
    url: string,
    oneCb: <T>(d: Data) => T,
    secondCb: (d: T) => void,
    errorCb?: (a: ErrorModel) => void,
    method = 'get',
    data = {},
  ): Promise<void> => {
    const config: AxiosRequestConfig = {};
    if (method === 'post') {
      config.headers = header;
      return ApiClient.post(url, data, config)
        .then(res => callback(normalizeCallback(res.data))).catch(error => someHandler(error));            
    } else {
      return ApiClient.get(url)
        .then(res => callback(normalizeCallback(res.data))).catch(error => someHandler(error));
    }
  };

  // ONLY ONE POST METHOD TO MAKE IT MORE CLEAR
  static someArchiveMethod = (
    callback: (a: SuccessModel) => void,
    errorCallback: (error: ErrorModel) => void,
    cardId: string
  ): Promise<void> => {
    return ApiService.makeApiCall<SuccessfulResponse>(
      'appreciationCard/archive',
      Normalizer.successfulResponse,
      callback,
      errorCallback,
      'post',
      { cardId }
    );
  };

  // HERE BELOW THE GET METHODS
  static getPeople = (cb: (a: PeopleModel[]) => void, page?: number, limit?: number): Promise<void> => {
    const queryDetails = { page, limit };
    return ApiService.makeApiCall<PeopleModel[]>(
      `people?${toQueryString(queryDetails)}`,
      Normalizer.normalizePeople,
      callback
    );
  };
};

이것이 내가 GET과 관련된 모든 것을 테스트하는 방법입니다.

describe('apiService', () => {
  beforeAll(() => {
    expect(ApiClient.defaults.headers.common.Authorization).toBe('Bearer test token');
    // @ts-ignore
    ApiClient.get.mockImplementation((url: string) => {
      return Promise.resolve({ data: mockData });
    });
  });

  it('should call api client method', () => {
    ApiService.makeApiCall(
      'testUrl',
      data => data,
      res => res,
      err => err,
      'get'
    );

    expect(ApiClient.get).toBeCalledTimes(1);
    expect(ApiClient.get).toBeCalledWith('testUrl');
  });

  it('should call callbacks consequently', done => {
    ApiService.makeApiCall('testUrl', firstCallback, secondCallback).then(() => {
      expect(firstCallback).toBeCalledTimes(1);
      expect(firstCallback).toBeCalledWith(mockData);
      expect(secondCallback).toBeCalledTimes(1);
      expect(secondCallback).toBeCalledWith(firstCallback(mockData));
      done();
    });
  });
});

describe('api service error flow', () => {
  beforeAll(() => {
    // @ts-ignore
    ApiClient.get.mockImplementation((url: string) => {
      console.log('error result');
      return Promise.reject(mockError);
    });
  });

  it('should handle error', done => {
    console.error = jest.fn();

    const firstCallback = jest.fn((data: any) => data);
    const secondCallback = jest.fn((data: any) => data);

    ApiService.makeApiCall('testUrl', firstCallback, secondCallback).then(() => {
      expect(firstCallback).toBeCalledTimes(0);
      expect(secondCallback).toBeCalledTimes(0);
      expect(console.error).toBeCalledTimes(1);
      expect(console.error).toBeCalledWith('ApiClient testUrl', mockError);
      done();
    });
  });
});

describe('apiService methods', () => {
  beforeAll(() => {
    ApiClient.get.mockImplementation((url: string) => {
      expect(ApiClient.defaults.headers.common.Authorization).toBe('Bearer test token');

      return Promise.resolve({ data: mockData });
    });
  });

  it('getPeople method call with one param', () => {
    ApiService.getPeople(jest.fn(), 1, 1).then(() => {
      expect(ApiClient.get).toBeCalledWith('people?page=1&limit=1');
    });
  });
})

난 단지의 모든 인스턴스 변경하여 생각 ApiClient.getApiClient.post그것은을 POST 요청을 테스트하기 위해 작동합니다. 그러나 내가 그렇게하려고하면 그것은 말합니다 can not read mockImplementation of undefined. post매개 변수를 덮어 쓰기 위해 매개 변수 를 사용하도록 테스트에서 메소드를 변경하려고했지만 method = 'get'성공하지 못했습니다.이 오류가 발생합니다.

TypeError : apiClient_1.default.post는 함수가 아닙니다

이견있는 사람?


이유 중 하나 ApiClient는 방법이 없기 때문입니다 post.
토마스

안녕하세요, @Tomas는이 줄을보고-> return ApiClient.post(url, data, config) .then(res => callback(normalizeCallback(res.data))).catch(error => someHandler(error));게시 요청을 시도하면 제대로 작동합니다. 나는 17 개의 게시물 요청이 정상적으로 작동한다는 것을 의미합니다. 그렇다면 왜 테스트에서 작동하지 않습니까?
반응

@Reacting "post"유닛 테스트 예제를 공유하십시오
Oron Ben-David

@ OronBen-David 나는 get테스트 에서와 똑같이 시도했지만 질문의 모든 인스턴스를 변경하고 대신 get설정 했다는 질문에서 언급했습니다 post.
반응

이해하지만 작동하지 않는 코드를 언급하는 것이 더 분명합니다.
Oron Ben-David

답변:


5

문제를 조사했습니다. 우선, 코드에 정의하지 않은 콜백 호출, 명확하지 않은 정의 ApiClient등 몇 가지 문제가 있음을 알려 드리고자합니다 .

그래서 코드를 약간 단순화했지만 모든 주요 요소가있는 문제를 재현하기 위해 Repl 예제를 만들었습니다.

, 살펴 보시기 바랍니다 https://repl.it/@SergeyMell/Some-Jesting을

그것은 모두 성공적으로 작동 get하고 post문제없이 방법. 주의해야 할 주요 사항은 다음과 같습니다.

  1. 로 사용 axiosApiClient입니다. (당신의 질문에서 명확하지 않았으므로 그렇게 가정했습니다)
    const ApiClient = require('axios');
  2. 에 농담 모의 설정 axios(공급, 당신은 동일하게)
    jest.mock('axios');
  3. 비슷한 방식으로 ( 모두 getpost동일) 모의를 두거나 요청

    ApiClient.get.mockImplementation((url) => {
      return Promise.resolve({ data: mockData });
    });
    
    ApiClient.post.mockImplementation((url) => {
      return Promise.resolve({ data: mockData });
    });

따라서 제 예제를 확인하고 코드와의 차이점을 확인한 후 필요한 추가 detalization에 대해 알려주십시오.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.