私は、支払いを完了するためにAuthorize.nets Accept.js SDKを使用する角度成分を持っています。ユーザーが支払い画面にいない限り、Accept.jsスクリプトをロードしたくないため、コンポーネント内のonInit
というメソッドを使用してスクリプトをページに追加します。角型Accept.js破損ユニットテスト '参照エラー:受け入れが定義されていません'
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);
}
}
たときにスクリプトがDOMにロードされ、使用可能であるように、これはユーザーのために正常に動作しますコンポーネントは、Accept
APIを使用するサービスを呼び出します。
しかし、APIを使用するサービスの私の単体テストは、と言うコード行をテストしようとしたときにAccept
が何であるかについてのリファレンスを持っていません。'参照エラー:受け入れが定義されていません。。
私はさまざまな方法でAcceptを試してみましたが、どれもテストで利用できません。コードを使用しようとしたときに宣言されるように、私のモックAccept
をサービスに挿入するにはどうすればいいですか?
内のオブジェクト。単体テストでは、単体テストでは実物をテストするのが難しいので、単体テストが壊れます – estus
私はそれに対してテストしていない、私はそれを定義する必要があります。 – efarley
ここでのポイントは、潜在的な副作用のために、実際のAccept.dispatchData(さらに重要なのは、document.createElement)が単体テストで呼び出される機会を持つべきではないということです。これはDIが助けてくれるものです。代わりに、beforeEachにwindow.Acceptを定義する方法があります。これはAngularよりもイディオムではありません。 – estus