Jest를 사용한 모의 API 호출

누가 모의가 필요합니까?



소프트웨어 테스트에서 "조롱"또는 "조롱"이라는 용어는 어디에나 있지만 여러 의미가 있어 혼동을 일으킬 수 있습니다. 조롱은 기능, 모듈, 서버를 가리킬 수 있습니다. 그리고 그것이 의미하는 바는 무엇입니까? 필요하세요?? 아!?

긴장을 풀고 모의는 그렇게 어렵지 않습니다. "모의"는 웹 애플리케이션을 테스트할 때 유용할 수 있는 테스트 패턴 유형입니다. 높은 수준에서 조롱은 함수 또는 함수의 일부를 우리가 명시적으로 제어하는 ​​것으로 대체하는 아이디어입니다. 이에 대한 일반적인 예는 원격 API 호출입니다. 상황을 상상해 보십시오. 원격 API를 호출하고 데이터가 페이지에 올바르게 렌더링되는지 테스트하는 테스트가 있습니다. 이것은 애플리케이션의 핵심 부분일 수 있으므로 테스트해야 하지만 API를 호출하고 데이터가 페이지에 렌더링되는지 테스트하는 테스트를 작성하는 것은 문제가 될 수 있습니다. API가 다운되면 어떻게 됩니까? 이렇게 하면 테스트가 중단되지만 코드가 손상되지 않고 손상된 외부 API이므로 스마트하지 않습니다. 그리고 인터넷 연결이 끊어지면 어떻게 됩니까? 이로 인해 테스트가 실패할 수도 있습니다. 또는 API가 다시 보내는 데이터 형식을 변경하면 어떻게 될까요? 다시 테스트는 실패하지만 이 실패는 소프트웨어를 합리적으로 나타내지 않습니다. 코드가 깨진 것이 아니라 변경된 외부 API입니다. 이 개념을 테스트의 "취성"이라고 합니다. 즉, 코드가 잘못되지 않았더라도 기본적으로 테스트가 실패할 가능성이 얼마나 되는지입니다.

조롱이란 무엇입니까?



Mock은 API를 호출할 때 테스트의 취약성을 줄여 이 문제를 해결하는 데 도움이 됩니다. 모의는 Martin Fowler 에 정의된 "테스트 더블"범주에 속합니다. 모의 함수를 생성하면 느린 함수나 API 호출을 다른 것으로 대체할 수 있으며, 함수가 호출된 방법, 호출 횟수를 캡처하는 것과 같은 코드를 테스트하는 추가 방법에 액세스할 수 있습니다. 호출되었거나 함수가 호출된 매개변수.

조롱



Jest에서 모의 ​​함수를 만드는 3가지 주요 방법이 있습니다. 이것들은
* jest.fn()* jest.mock()* jest.spyOn()
Jest.fn()은 단일 함수를 모의하는 데 사용되는 반면 jest.mock()은 전체 모듈을 모의하는 데 사용됩니다. jest.spyOn()은 함수가 어떻게 호출되었는지에 대한 더 많은 정보를 캡처한다는 점에서 약간 다릅니다. 세 가지 모두 관련이 있으며 고유한 방식으로 유용할 수 있습니다.

예를 들어 보겠습니다. 정말 느린 api 호출을 수행한 다음 반환된 내용에 따라 응답을 제공하는 함수가 있다고 가정해 보겠습니다.

export async function getStockValue() {
  const conversionRate = 0.91;
  const data = await fetch(“http://www.slow-url.com”); // For the purposes of this example imagine this returns a falsy value, or try using http://www.google.com
  if (!data || Object.keys(data).length < 1) {
    return false;
  } else {
    return data.payload * conversionRate;
  }
}


이 함수는 분명히 매우 간단하지만 mocking에서 값을 보여줄 수 있습니다. 그다지 효과적이지 않은 테스트를 작성하는 방법부터 시작하겠습니다.

describe("the getStockValue function", () => {
  it("returns false if no data is returned by the API", async () => {
    const value = await getStockValue();
    expect(value).toBe(false);
  });
});


(이 테스트를 이해하지 못하면 Jest docs을 확인하십시오. 이 간단한 테스트는 기능을 테스트하지만 앞에서 설명한 모든 문제에 취약합니다. 인터넷 연결이 끊어지면 속도가 느려질 수 있습니다. 또는 API 자체가 다운된 경우 다음과 같이 함수를 테스트하면서 이 문제를 해결할 수 있습니다.

describe("the getStockValue function", () => {
  it("returns false if no data is returned by the API", async () => {
    global.fetch = jest.fn(() => {
      Promise.resolve();
    });
    const value = await getStockValue();
    expect(fetch).toHaveBeenCalledTimes(1);
    expect(value).toBe(false);
  });
});


여기서 우리는 전역 fetch 함수를 조롱하고 약속을 해결하지만 아무 것도 반환하지 않는다고 지시합니다. 이렇게 하면 함수가 false를 반환하도록 트리거하고 이에 대해 주장할 수 있으므로 API가 아무 것도 반환하지 않으면 함수가 false를 반환하는지 테스트합니다. 그러나 여기에서 조롱을 통해 코드가 예상대로 작동하는지 확인하는 다른 방법에 액세스할 수 있음을 알 수 있습니다. 이 경우 한 번만 호출된 가져오기에 대해 주장할 수 있습니다.

그게 다야, 여러분!



이 짧은 기사가 Jest의 조롱 기능을 사용하는 데 도움이 되었기를 바랍니다. 질문이 있거나 저에게 연락하고 싶다면 [email protected] 으로 전화하십시오. 당신의 조롱 노력에 행운을 빕니다!

좋은 웹페이지 즐겨찾기