TypeScript 단위 테스트: `private` 멤버에 액세스

면책 조항: 이것은 긴 토론이 아닙니다. 그러나 작은 참조 유형 게시물. 자세히 알아보겠습니다. 나는 그것이 짧은 것을 좋아한다.

비공개 테스트에 대해 진행 중인 논쟁이 있습니다members (methods, fields, properties, ...). 제 생각에는 그렇게 하는 것이 유용한 경우가 있습니다.

C#과 같은 언어에서는 전용 멤버를 직접 검사/테스트할 수 없습니다. 그러나 비공개 멤버가 보호되는 일반적인 상속 기반 해결 방법이 있습니다.
테스트 코드에서 해당 클래스를 확장하고 래퍼/접근자를 작성하여 이러한 멤버에 액세스합니다. 그런 다음 파생 클래스를 실제로 테스트합니다.

이는 번거롭고 테스트하려는 클래스의 의미 체계도 변경합니다. private 멤버는 파생 클래스에서 액세스하기 위한 것으로 보입니다. 사실이 아닙니다!



JavaScript/TypeScript는 그렇게 할 것을 요구하지 않습니다(최소한 TypeScriptprivate 멤버의 경우 ES private(# ) 클래스 필드가 아님).

// mod.ts
export class SomeClass {
    private _somePrivateProp = "foo";
}


JavaScript는 멤버가 TypeScript에 의해 표시private되더라도 상관하지 않습니다.
TypeScript 컴파일러는 점 표기법( private )을 사용하여 클래스 외부에서 멤버inst.prop에 액세스하지 않도록 합니다.
But it is possible to access the property using bracket notation ( inst["prop"] ) .

// mod.test.ts
import {SomeClass} from "./mod.ts";
test("privatePropIsFoo", () => {
    const inst = new SomeClass();
    expect(inst._somePrivateProp).toBe("foo"); // TS2341: Property '_somePrivateProp' is private and only accessible within class 'SomeClass'.

    expect(inst["_somePrivateProp"]).toBe("foo"); // OK
})


리팩토링 도구가 여전히 작동하기 때문에 이것은 훌륭합니다. 그리고 많은 중복 코드를 절약합니다.

그러나 주의 사항이 있습니다. jest.spy(inst, "_privateMethod")는 작동하지 않습니다. TypeScript는 공개 메서드만 감시하도록 강제하기 때문입니다. 가장 간단한 해결 방법은 inst as any 를 캐스팅하는 것입니다. 모든 구성원을 공용으로 취급하는 유틸리티 유형이 있을 때까지. As already suggested.

좋은 웹페이지 즐겨찾기