Usando Angular2 TestBed para zombar de um serviço com um parâmetro de interface de classe não concreto

Eu tenho um componente que estou tentando configurar e testar usando TestBed.

Este componente contém uma classe que possui um parâmetro no construtor que é uma interface, não uma classe concreta. Essa interface é satisfeita com qualquer classe que eu escolher usar (a real ou a mok para testes de unidade). Mas quando estou construindo o componente que usa esse serviço no TestBed, não consigo descobrir como definir esse parâmetro para a configuração do TestBed.

Aqui está a configuração TestBed para o componente:

describe('PanelContentAreaComponent', () => {
  let ,component: PanelContentAreaComponent;
  let fixture: ComponentFixture<PanelContentAreaComponent>;

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ PanelContentAreaComponent
          ],
      providers:[
        MenuCommandService, ProcedureDataService, IOpenService],
      schemas: [CUSTOM_ELEMENTS_SCHEMA]
    })
    .compileComponents();
  }));

O serviço que está tendo problemas para ser construído no TestBed é o ProcedureDataService. Sua definição está abaixo:

@Injectable()
export class ProcedureDataService {

serverOpenFile: OpenFile;

constructor(private _openService: IOpenService) {
    this.serverOpenFile = emptyFileStatus;
}

O único parâmetro no construtor doProcedureDataService éIOpenService cuja definição é:

export interface IOpenService {
    openFile(fileType: string, dataType: string, filePath: string) ;
}

Como você pode ver, essa é uma interface, não uma classe concreta.

No meu teste de unidade de serviço, simulamos o IOpenService, implementando-o da seguinte maneira:

export class mockOpenService implements IOpenService{

    constructor(){}

    openFile(fileType: string, dataType: string, filePath: string) {
        let fileContent: OpenFile;
... 
...
[fake the data with mok junk]
...
        fileContent = {
            'filePath': filePath,
            'fileName': name,
            'openSuccess': isSuccess,
            'error': errorMsg,
            'fileData': jsonData
        };

        return Observable.of(fileContent);

    }

}

Isso funciona muito bem no teste da unidade de serviço ProcedureDataService. E, é claro, no código real, implementamos o IOpenService com o serviço completo de abertura de arquivo implementado que obtém os dados corretamente.

Mas, ao tentar usar esse serviço dentro de um componente, recebo o seguinte erro:

PanelContentAreaComponent should create FAILED
        Failed: IOpenService is not defined
        ReferenceError: IOpenService is not defined

Isso faz sentido, então estou tentando descobrir como informar ao TestBed que tenho uma implementação de classe concreta desse IOpenService que desejo usar. Eu tentei isso, mas falha:

describe('PanelContentAreaComponent', () => {
  let component: PanelContentAreaComponent;
  let fixture: ComponentFixture<PanelContentAreaComponent>;

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ PanelContentAreaComponent
          ],
      providers:[
        {provide: IOpenService, useClass: mockOpenService},
        MenuCommandService, ProcedureDataService, IOpenService],
      schemas: [CUSTOM_ELEMENTS_SCHEMA]
    })
    .compileComponents();
  }));

O compilador está me dizendo:

(31,19): error TS2693: 'IOpenService' only refers to a type, but is being used as a value here.

e ainda estou recebendo:

PanelContentAreaComponent should create FAILED
        Failed: IOpenService is not defined
        ReferenceError: IOpenService is not defined

Então, como eu instruoTestBed que eu tenho uma classe específica (mockOpenService) implementação de um parâmetro de interface (IOpenService) necessário para o serviço (ProcedureDataService) sendo fornecido para testar este componente (PanelContentAreaComponent)?

questionAnswers(1)

yourAnswerToTheQuestion