testare unitară - Creează o clasă anonimă extinsă pentru clasa abstractă în TypeScript


Am o clasă abstractă care are câteva metode protected implementate și câteva metode abstracte. Încerc să scriu niște teste pentru metodele protected.

Deoarece acestea nu sunt disponibile nici măcar în clasele extinse în afara lumii externe, aș dori să creez clasa Test anonimă care poate extinde și verifica/mock-a lucrurile mele.

export abstract class AbsClass implements AbsInterface {

    protected extract(filter: string) {
    //some implemented code to test
    }

    abstract someMethod();
}

Nu reușesc să înțeleg cum să creez ceva de genul acesta anonim

export class TestClass extends AbsClass {
   public testExtract(){
        //call super.extract and verify result
   }
}

Răspuns #1

M-am întâlnit cu asta înainte. Se pare că cuvintele cheie export/abstract interferează între ele. A trebuit să definesc clasa și apoi să o export pe o linie separată pentru a o ocoli.

Exemplu :

abstract class BaseClass {}

export default BaseClass

Răspunsul #2

Există câteva soluții alternative discutate în această problemă înrudită. Vezi de asemenea:

  • https://github.com/microsoft/TypeScript/issues/36060
  • https://github.com/microsoft/TypeScript/issues/17293
  • https://github.com/microsoft/TypeScript/issues/35822

Răspunsul scurt este că este foarte dificil să reprezinți în prezent clasele anonime care accesează membri privați/protejați ai clasei lor de bază. Dacă încerci doar să testezi părți ale clasei de bază, oare clasa care implementează trebuie într-adevăr să fie anonimă?

(Ca o paranteză: Sunt încă destul de nou în testare în general, dar am văzut multe sfaturi formulate ferm despre faptul că nu ar trebui să testezi în mod explicit metodele private/protejate. Ar fi mai bine să testezi metodele API publice care apelează metodele private/protejate în schimb?)