TestBedを使用すると、依存性注入で利用可能なクラスのモック クラスを作成できます。たとえば、これらは依存性注入で実装されているため、andMyButtonClass
にアクセスできるため、それらをオーバーライドできます。私が抱えている問題は、Jasmine テストを作成するには、依存性注入でアクセスされないクラスのメソッドをオーバーライドするモック クラスを作成する必要があることです。ElementRef
MyService
この場合、グローバル空間ScriptLoader.load
にロードされます。ThirdPartyCheckout
これは、Jasmine が subscribe オペレーターの内容を読み取るときに利用できない可能性があることを意味します。このため、前者を最初にモックし、次に後者をモックしたいと思います。または、これを回避する別の方法があるかもしれません。
ScriptLoader.load
メソッドとメソッドをオーバーライドするモック クラスを作成する方法を誰かが提案できれば、それは素晴らしいことThirdPartyCheckout.configure
です。
テストするディレクティブ:
@Directive({
selector: '[myButton]'
})
export class MyButtonClass implements AfterViewInit {
private myKey: string;
constructor(private _el: ElementRef, private myService: MyService) {}
ngAfterViewInit() {
this.myService.getKey()
.then((myKey: string) => {
this.myKey = myKey;
ScriptLoader.load('https://thirdpartyurl.js', this._el.nativeElement)
.subscribe(
data => {
this.handeler = ThirdPartyCheckout.configure(<any>{
key: this.myKey
// etc
// and some methods go here
});
},
error => {
console.log(error);
}
);
});
}
}
テストコードは次のとおりです。
@Component({
selector: 'test-cmp',
template: ''
})
class TestComponent {}
class mockMyService {
getKey() {
return Promise.resolve('this is a key in real code');
}
}
describe('myButton', () => {
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [TestComponent, MyButtonClass],
providers: [
{provide: MyService, useClass: mockMyService}
]
});
});
describe('ngAfterViewInit', fakeAsync(() => {
const template = '<div><div myButton></div></div>';
TestBed.overrideComponent(TestComponent, {set: {template: template}});
let fixture = TestBed.createComponent(TestComponent);
fixture.detectChanges();
tick();
}));
});