How to stub a private method of a class written in typescript using sinon

SHRUTHI BHARADWAJ picture SHRUTHI BHARADWAJ · Nov 22, 2017 · Viewed 7.9k times · Source

I am writing unit tests for a public method which is, in turn, calling a private method of the class written in typescript (Node JS).

Sample Code

class A {
   constructor() {  
   }
   public method1() {  
       if(this.method2()) {
          // Do something
       } else {
          // Do something else
       }
   }
   private method2() {
      return true;
   }
}

Now to test method1() I need to stub method2() which is a private method.

here what I am trying :

sinon.stub(A.prototype, "method2");

Typescript is throwing the error :

Argument of type '"method2"' is not assignable to parameter of type '"method1"'

Any help would be appreciated. Thank You

Answer

Titian Cernicova-Dragomir picture Titian Cernicova-Dragomir · Nov 22, 2017

The problem is that the definition for sinon uses the following definition for the stub function :

interface SinonStubStatic { <T>(obj: T, method: keyof T): SinonStub; }

This means that the second parameter must be the name of a member (a public one) of the T type. This is probably a good restriction generally, but in this case it is a bit too restrictive.

You can get around it by casting to any:

sinon.stub(A.prototype, <any>"method2");