Cómo inyectar el documento en el servicio angular 2

Tengo una aplicación Angular2. Para burlar el objeto Document en pruebas, me gustaría inyectarlo al servicio como:

 import { Document } from '??' @Injectable() export class MyService { constructor(document: Document) {} } 

El servicio de Title de angular usa el getDOM() interno getDOM() :

https://github.com/angular/angular/blob/master/modules/%40angular/platform-browser/src/browser/title.ts

¿Hay alguna forma simple de inyectar el documento al servicio? Además, ¿cómo debería hacer referencia a él en la matriz de proveedores?

Esto es soportado directamente en Angular desde hace un tiempo

https://angular.io/api/common/DOCUMENT

my-service.ts:

 import { Inject, Injectable } from '@angular/core'; import { DOCUMENT } from '@angular/common'; @Injectable() export class MyService { constructor(@Inject(DOCUMENT) private document: any) {} } 

my-service.spec.ts

 import { provide } from '@angular/core'; import { DOCUMENT } from '@angular/common'; import { MyService } from './my-service'; class MockDocument {} describe('MyService', () => { beforeEachProviders(() => ([ provide(DOCUMENT, { useClass: MockDocument }), MyService ])); ... }); 

No puedo comentar directamente la pregunta de adamdport (todavía no hay 50 puntos de repetición), pero aquí está como se indica en los documentos angulares.

Blockquote @ GünterZöchbauer parece que DOCUMENT está en desuso. ¿Alguna idea de cómo hacer esto una vez que se ha ido? Por ejemplo, ¿cómo establecería el favicon dinámicamente?

En lugar de importar desde el navegador de la plataforma, haga lo siguiente:

 import { DOCUMENT } from '@angular/platform-browser'; 

Importar desde angular común:

 import {DOCUMENT} from '@angular/common'; 

además de la respuesta de @Günter Zöchbauer.

Angular define DOCUMENT como InjectionToken

 export const DOCUMENT = new InjectionToken('DocumentToken'); 

dom_tokens.ts

E inyectarlo con el documento en browser.ts

 {provide: DOCUMENT, useFactory: _document, deps: []} export function _document(): any { return document; } 

Por lo tanto, cuando lo usemos, solo necesitamos inyectar @Inject(DOCUMENT)

o usa el token directamente en deps:[DOCUMENT]