Ich habe eine Angular 2-Anwendung. Um das Document
Objekt in Tests zu verspotten , möchte ich es wie folgt in den Dienst einfügen:
import { Document } from '??'
@Injectable()
export class MyService {
constructor(document: Document) {}
}
Der Title
Dienst von Angular verwendet die interne getDOM()
Methode .
Gibt es eine einfache Möglichkeit, das Document
in den Dienst einzuspeisen? Wie soll ich im providers
Array darauf verweisen ?
typescript
angular
RJo
quelle
quelle
Antworten:
Dies wird seit einiger Zeit von Angular unterstützt.
Sie können die
DOCUMENT
vom@angular/common
Paket bereitgestellte Konstante verwenden .Beschreibung der
DOCUMENT
Konstante (aus der API-Dokumentation entnommen ):Ein Beispiel ist wie folgt:
my-service.service.ts:
import { Inject, Injectable } from '@angular/core'; import { DOCUMENT } from '@angular/common'; @Injectable() export class MyService { constructor(@Inject(DOCUMENT) private document: Document) {} }
my-service.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 ])); ... });
quelle
declare const document: Document;
und dannbootstrap(provide(Document, { useValue: document }));
HTMLDocument
anstelle vonany
:@Inject(DOCUMENT) private document: HTMLDocument
Ich kann die Frage von adamdport nicht direkt kommentieren (noch nicht 50 Wiederholungspunkte), aber hier ist es wie in den eckigen Dokumenten angegeben.
Anstatt wie folgt aus dem Plattformbrowser zu importieren:
import { DOCUMENT } from '@angular/platform-browser';
Importieren Sie es aus eckigen gemeinsamen:
import {DOCUMENT} from '@angular/common';
quelle
zusätzlich zu @ Günter Zöchbauers Antwort.
Angular definiert DOKUMENT als InjectionToken
export const DOCUMENT = new InjectionToken<Document>('DocumentToken');
dom_tokens.ts
Und fügen Sie es mit Dokument in browser.ts ein
{provide: DOCUMENT, useFactory: _document, deps: []} export function _document(): any { return document; }
Wenn wir es verwenden, müssen wir es daher nur injizieren
@Inject(DOCUMENT)
oder verwenden Sie den Token direkt in
deps:[DOCUMENT]
quelle
import { Inject, Injectable } from '@angular/core'; import { DOCUMENT } from '@angular/common'; @Injectable() export class MyService { constructor(@Inject(DOCUMENT) private document) {} }
Es ist das ": Dokument", das das Problem verursacht.
quelle