Ako jednotkovo testovať súkromné metódy v Typescripte


Keď som sa pokúsil vykonať jednotkové testovanie súkromných metód v triede, dostal som chybu súkromné metódy sú prístupné iba vo vnútri triedy. Tu som pridal vzorový úryvok pre moju triedu a mocha test. Láskavo mi poskytnite riešenie, ako implementovať jednotkový test pre súkromné metódy.

Názov triedy: Notification.ts

class Notification {
 constructor() {}
 public validateTempalte() {
  return true;
 }

 private replacePlaceholder() {
  return true;
 }
}

Jednotkový test:

import {Notification} from 'Notification';
import * as chai from "chai";

describe("Notification", function(){

  describe('#validateTempalte - Validate template', function() {
      it('it should return success', function() {
        const result = new Notification()
        chai.expect(result.validateTempalte()).to.be.equal(true);
      });
    });
  describe('#replacePlaceholder - Replace Placeholder', function() {
      it('it should return success', function() {
        const result = new Notification()
        // As expected getting error "Private is only accessible within class"
        chai.expect(result.replacePlaceholder()).to.be.equal(true);
      });
    });
});

Ako obchádzku momentálne mením špecifikátor prístupu funkcie replacePlaceholder na public. Ale nemyslím si, že je to platný prístup.

Odpoveď č. 1

Možným riešením, ako vynechať kontroly TypeScriptu, je dynamicky pristupovať k vlastnosti (Nehovorím, či je to dobré).

myClass['privateProp'] alebo pre metódy: myClass['privateMethod']()

Odpoveď č. 2

Technicky, v súčasných verziách TypeScript sú súkromné metódy kontrolované ako súkromné len počas kompilácie - takže ich môžete zavolať.

class Example {
    public publicMethod() {
        return 'public';
    }

    private privateMethod() {
        return 'private';
    }
}

const example = new Example();

console.log(example.publicMethod()); // 'public'
console.log(example.privateMethod()); // 'private'

Spomínam to len preto, že ste sa pýtali, ako to urobiť, a takto by ste to mohli urobiť.

Správna odpoveď

Avšak, táto súkromná metóda musí byť volaná nejakou inou metódou... inak sa vôbec nevolá. Ak otestujete správanie tej druhej metódy, pokryjete súkromnú metódu v kontexte, v ktorom sa používa.

Ak konkrétne testujete súkromné metódy, vaše testy sa stanú úzko previazané na implementačné detaily (t.j. dobrý test by nemusel byť zmenený, keby ste refaktorovali implementáciu).

Vylúčenie zodpovednosti

Ak to stále testujete na úrovni súkromnej metódy, kompilátor môže v budúcnosti zmeniť a spôsobiť, že test zlyhá (t. j. ak by kompilátor spravil metódu „skutočne“ súkromnou, alebo ak by budúca verzia ECMAScript pridala kľúčové slová viditeľnosti, atď).

Odpoveď č. 3

V mojom prípade používam prototyp objektu na prístup k súkromnej metóde. Funguje to dobre a TypeScript sa nesťažuje.

Napríklad:

class Example {
    private privateMethod() {}
}

describe() {
    it('test', () => {
        const example = new Example();
        const exampleProto = Object.getPrototypeOf(example);

        exampleProto.privateMethod();
    })
}

Ak používate statickú metódu, použite exampleProto.constructor.privateMethod();.

Súvisiace články