Ich habe eine eckige Komponente, die das Autorize.nets Accept.js SDK verwendet, um eine Zahlung abzuschließen. Ich möchte das Accept.js-Skript nicht laden, es sei denn, der Benutzer befindet sich auf dem Zahlungsbildschirm. Daher füge ich das Skript der Seite über eine Methode hinzu, die ich unter der Nummer onInit
in der Komponente anrufe.Angular Accept.js Unterbrechungseinheit Tests 'Reference Error: Accept ist nicht definiert'
some.component.ts
ngOnInit {
this.addAcceptJsScript();
}
private addAcceptJsScript(): void {
const element = document.createElement('script');
element.src = environment.acceptJsUrl;
element.type = 'text/javascript';
document.getElementsByTagName('head')[0].appendChild(element);
}
some.service.ts
declare var Accept: any;
@Injectable()
export class SomeService {
private sendPaymentToAuthNet(paymentPayload): void {
Accept.dispatchData(paymentPayload, this.handleAuthNetResponse);
}
}
Dies funktioniert für die Benutzer fein wie das Skript im DOM und verfügbar geladen wird, wenn die Komponente ruft den Dienst auf, der die Accept
API
verwendet Allerdings hat mein Komponententest in dem Dienst, der die API verwendet, keinen Verweis darauf, was Accept
ist, wenn es versucht, die Codezeile zu testen, wo ich Accept.dispatchData(...)
die Testfehler herausrufende 'Verweisfehler: Akzeptieren ist nicht definiert ".
Ich habe verschiedene Arten der Verspottung versucht akzeptieren, aber keiner von ihnen machen es für den Test verfügbar. Wie gehe ich vor, um meinen Schein Accept
in den Dienst zu injizieren, so dass es deklariert wird, wenn der Code versucht, es zu verwenden?
Ich würde in der karma.config in meinen Dateien enthalten erwarten, dass Sie Unit-Tests und nicht die Integration ausführen. Das Testen gegen reale Dinge ist in Komponententests schlecht, weil dies die Isolation unterbricht. – estus
Ich teste nicht dagegen, ich brauche es nur definiert. – efarley
Der Punkt hier ist, dass echte Accept.dispatchData (und noch wichtiger, document.createElement) nicht einmal eine Chance haben, im Komponententest aufgrund möglicher Nebenwirkungen aufgerufen werden. Damit soll DI helfen. Die Alternative besteht darin, ein Fenster zu definieren.Akzeptieren in beforeEach, das für Angular weniger idiomatisch ist. – estus