Today I went against my better judgement of usign a mock framework and decided to create my own mocks to allow coverage testing for an IPC-calling code.

My reference code I wanted to test is:

export class ScanTriggerEvent {
  name: string = 'scan'

  constructor(private pathService: PathsService) {}

  /**
   * Send a scan event to the background scanner
   *
   * @param stream the stream through which we send the message
   */
  execute(stream: any): any {
    logger.debug('ScanTriggerEvent: execute()')
    if (this.pathService) {
      this.pathService.getSourcePaths().then((value: any) => stream.send(this.name, value))
    }
  }
}

The code would use an angular service named PathService which, for the purpose of this test only has a method named getSourcePaths(), which returns a Promise. Now, I needed to emulate that method, and the code I wrote to do that is:

// The service
let service: any = {
  getSourcePaths(): any {
    return {
      then(fun: any): any {
        fun()
      }
    }
  }
}

It basically defines an object containing a method getSourcePaths() which returns another object containing a method named then(fun:any) which accepts a parameter fun and calls it. Simple. In jargon, I've implemented an anonymous interface :)

HTH,