web-dev-qa-db-fra.com

Comment tester les méthodes privées dans Typescript

Quand j'ai essayé de faire des tests unitaires pour méthodes privées dans une classe obtenant une erreur car les méthodes privées ne sont accessibles qu'à l'intérieur de la classe . Ici, j'ai ajouté un extrait d'extrait pour mon test de classe et de moka. Veuillez me fournir une solution pour implémenter le test unitaire pour les méthodes privées.

Nom de classe: Notification.ts

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

 private replacePlaceholder() {
  return true;
 }
}

Test unitaire:

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);
      });
    });
});

Comme solution de contournement, actuellement, je change le spécificateur d'accès de la fonction replacePlaceholder à public. Mais je ne pense pas que ce soit une approche valable.

10
Ashok JayaPrakash

Techniquement , dans les versions actuelles de TypeScript, les méthodes privées ne sont vérifiées à la compilation que pour être privées - vous pouvez donc les appeler.

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

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

const example = new Example();

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

Je mentionne cela uniquement parce que vous avez demandé comment le faire, et c'est ainsi que vous pourriez faites-le.

Bonne réponse

Cependant, cette méthode privée doit être appelée par une autre méthode ... sinon elle n'est pas appelée du tout. Si vous testez le comportement de cette autre méthode, vous couvrirez la méthode privée dans le contexte où elle est utilisée.

Si vous testez spécifiquement des méthodes privées, vos tests seront étroitement liés aux détails de l'implémentation (c'est-à-dire qu'un bon test n'aurait pas besoin d'être modifié si vous refactorisez l'implémentation).

Avertissement

Si vous testez toujours au niveau de la méthode privée, le compilateur pourrait à l'avenir changer et faire échouer le test (c'est-à-dire si le compilateur a fait la méthode " correctement "privé, ou si une future version d'ECMAScript ajoutait des mots clés de visibilité, etc.).

11
Fenton

Une solution possible pour omettre les vérifications TypeScript consiste à accéder dynamiquement à la propriété (sans savoir si elle est bonne).

myClass['privateProp'] Ou pour les méthodes: myClass['privateMethod']()

9
denu5