"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Jest 요약: 전역 객체의 속성과 메서드를 안전하게 모의

Jest 요약: 전역 객체의 속성과 메서드를 안전하게 모의

2024-08-05에 게시됨
검색:958

Jest Recap: Safely Mock Properties and Methods of Global Objects

요약:

  • 재정의/모의 속성/메서드가 다른 테스트에 영향을 미치는 것을 방지하고 싶습니다.
  • 로컬 개체(이 테스트에서 생성 및 소유)의 경우 다음을 사용할 수 있고 사용해야 합니다.
    • localObject.theAnswer = 42 및
    • localObject.calcTheAnswer = jest.fn(() => 42).
  • 전역 객체의 경우 사용해야 합니다.
    • jest.replaceProperty(globalObject, "theAnswer", 42) 및
    • jest.spyOn(globalObject, "calcTheAnswer").mockReturnValue(42).
  • jest.restoreAllMocks()가 afterEach() 후크에서 호출되는지 확인하세요.

무엇?

완벽한 세계 코드베이스에서는 전역 객체를 조작할 필요가 없지만 세계 코드베이스는 지저분합니다. 테스트 중입니다.

무슨 일이 있어도 피하고 싶은 것은 한 테스트가 다른 테스트에 영향을 미치는 것입니다. 테스트는 순서에 관계없이 또는 일부 테스트를 건너뛴 경우에도 의미가 있어야 합니다.

모의 속성

모의 값에 대한 순진한 접근 방식은 테스트에 필요한 값으로 속성을 설정하는 것입니다.
이 특정 테스트가 소유한(생성한) 로컬 개체의 값을 변경하는 한 괜찮습니다.

describe("override properties of local objects", () => {
    it("works and is harmless", () => {
        const myArray = [1];
        myArray.length = 0;
        expect(myArray).toHaveLength(0);
    });
    it("does not affect the next test", () => {
        const myArray = [1];
        expect(myArray).toHaveLength(1);
    });
});

전역 개체에 대해 그렇게 하면 지저분해집니다.

describe("don't override properties of global objects", () => {
    it("works before the property is overridden", () => {
        expect(window.innerWidth).toBeGreaterThan(0);
    });
    it("works, but is evil", () => {
        window.innerWidth = 0;
        expect(window.innerWidth).toBe(0);
    });
    it("fails in the test after the property was overridden", () => {
        expect(() => {
            expect(window.innerWidth).toBeGreaterThan(0); // 



jest.replaceProperty()는 다음을 위해 만들어졌습니다.

describe("use jest.replaceProperty() to override properties of global objects", () => {
    afterEach(() => {
        jest.restoreAllMocks();
    });
    it("works before the property is overridden", () => {
        expect(window.innerWidth).toBeGreaterThan(0);
    });
    it("works and is harmless", () => {
        jest.replaceProperty(window, "innerWidth", 0);
        expect(window.innerWidth).toBe(0);
    });
    it("does not affect the next test", () => {
        expect(window.innerWidth).toBeGreaterThan(0);
    });
});

조롱 방법

메서드는 속성과 유사하게 조롱될 수 있습니다.

describe("override methods of local objects using jest.fn()", () => {
    it("works and is harmless", () => {
        const mySet = new Set([1]);
        mySet.has = jest.fn().mockReturnValue(false);
        expect(mySet.has(1)).toBeFalsy();
    });
    it("does not affect the next test", () => {
        const mySet = new Set([1]);
        expect(mySet.has(1)).toBeTruthy();
    });
});

전역 객체에 myObject.someFunction = jest.fn()을 사용하면 테스트가 서로 의존하고 의미를 잃을 수 있습니다.

describe("don't override methods of global objects using jest.fn()", () => {
    it("works before the method is overridden", () => {
        expect(document.getElementById("foo")).toBeNull();
    });
    it("works, but is evil", () => {
        const el = document.createElement("div");
        document.getElementById = jest.fn().mockReturnValue(el);

        expect(document.getElementById("foo")).toBe(el);
    });
    it("fails in the test after the property was overridden", () => {
        expect(() => {
            expect(document.getElementById("foo")).toBeNull(); // 



전역 객체의 메소드를 어떻게 모의해야 합니까? 이것이 jest.spyOn()이 좋은 이유입니다:

describe("use jest.spyOn() to override methods of global objects", () => {
    afterEach(() => {
        jest.restoreAllMocks();
    });
    it("works before the method is overridden", () => {
        expect(document.getElementById("foo")).toBeNull();
    });
    it("works and is harmless", () => {
        const el = document.createElement("div");
        jest.spyOn(document, "getElementById").mockReturnValue(el);

        expect(document.getElementById("foo")).toBe(el);
    });
    it("does not affect the next test", () => {
        expect(document.getElementById("foo")).toBeNull();
    });
});

당신은 청소해야합니다

모든 테스트에서 시스템이 동일한(새롭고 깨끗한) 상태인지 확인하려면 각 테스트 후에 모의 상태를 복원해야 합니다.

가장 간단한 해결책은 RestoreMocks 구성 속성을 설정하는 것입니다.

가장 간단한 옵션은 afterEach()에서 jest.restoreAllMocks()를 호출하는 것입니다.

모든 테스트에 대해 모의하는 방법

때때로 파일의 모든 테스트에 대해 모의 작업을 수행하고 싶을 때가 있습니다. 최상위 레벨 또는 explain() 블록에서 jest.spyOn() 및 jest.replaceProperty()를 사용하는 경우 첫 번째 테스트가 실행된 후 모든 Mock이 재설정됩니다.

최상위 수준에서는 jest.spyOn() 및 jest.replaceProperty() 없이 속성과 메서드를 안전하게 재정의할 수 있습니다.

describe() 블록에 대해서만 모의하려는 경우 beforeEach() 후크에서 이러한 호출을 수행해야 합니다.

릴리스 선언문 이 기사는 https://dev.to/htho/jest-recap-safely-mock-properties-and-methods-of-global-objects-3ph8?1에서 복제됩니다. 침해가 있는 경우에는 Study_golang@163으로 문의하시기 바랍니다. .com에서 삭제하세요
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3