TypeScript 단위 테스트: `private` 멤버에 액세스
비공개 테스트에 대해 진행 중인 논쟁이 있습니다members (methods, fields, properties, ...). 제 생각에는 그렇게 하는 것이 유용한 경우가 있습니다.
C#과 같은 언어에서는 전용 멤버를 직접 검사/테스트할 수 없습니다. 그러나 비공개 멤버가 보호되는 일반적인 상속 기반 해결 방법이 있습니다.
테스트 코드에서 해당 클래스를 확장하고 래퍼/접근자를 작성하여 이러한 멤버에 액세스합니다. 그런 다음 파생 클래스를 실제로 테스트합니다.
이는 번거롭고 테스트하려는 클래스의 의미 체계도 변경합니다.
private
멤버는 파생 클래스에서 액세스하기 위한 것으로 보입니다. 사실이 아닙니다!JavaScript/TypeScript는 그렇게 할 것을 요구하지 않습니다(최소한 TypeScript
private
멤버의 경우 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.
Reference
이 문제에 관하여(TypeScript 단위 테스트: `private` 멤버에 액세스), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/htho/typescript-unit-tests-access-private-members-361o텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)