다음 테스트가 있습니다.
let component: MyComponent;
let fixture: ComponentFixture<MyComponent>;
let loader: HarnessLoader;
const items: MyItem[] = [
{
id: '66249535-31bf-41f3-8f55-8a14877c6d7e',
status: 'New'
}
];
const myServiceSpy = jasmine.createSpyObj<MyService>(
'MyService',
{
getItems: of(items),
changeItemStatus: of()
}
);
const alertsServiceSpy = jasmine.createSpyObj<AlertsService>('AlertsService', [
'error',
'warning',
'success',
'info'
]);
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [MyComponent, TableComponent],
providers: [{ provide: MyService, useValue: myServiceSpy }, { provide: AlertsService, useValue: alertsServiceSpy}],
imports: [MatTableModule, SharedModule]
}).compileComponents();
}));
beforeEach(() => {
myServiceSpy.getItems.calls.reset();
fixture = TestBed.createComponent(MyComponent);
loader = TestbedHarnessEnvironment.loader(fixture);
component = fixture.componentInstance;
component.myId = 123;
fixture.detectChanges();
});
afterAll(() => {
myServiceSpy.getItems.and.returnValue(of(items));
});
it('should call to change the item status if the slider is toggled', async(() => {
component.onItemChange(items[0], { checked: true, event: { source: { checked: true }}});
component.onItemChange(items[0], { checked: false, event: { source: { checked: false }}});
fixture.whenStable().then(() => {
fixture.detectChanges();
expect(myServiceSpy.changeItemStatus).toHaveBeenCalled();
});
}));
그리고 다음 구성 요소
ngOnInit() {
const updatedItems$ = this.itemChangeSubject.asObservable().pipe(
switchMap(itemChange => {
this.itemBeingChanged = itemChange.item;
this.toggleEvent = itemChange.event;
return this.myService.changeItemStatus(
this.myId,
itemChange.item.id
)
.pipe(catchError(() => {
this.clicked = false;
this.toggleEvent.source.checked = ! this.toggleEvent.source.checked;
return empty();
}));
}),
tap({
next: () => {
const itemStatus = this.itemBeingChanged.isItemChanged ? 'active' : new';
this.clicked = false;
this.alerts.success({
message: `Item is now ${itemStatus}.`
});
}
}),
switchMap(() => this.myService.getItems(
this.myId
)
.pipe(catchError(() => {
return empty();
}))
)
);
this.items$ = this.myService
.getItems(this.myId)
.pipe(catchError(() => {
return empty();
}))
.pipe(concat(updatedItems$))
}
onItemChange(item: MyItem, event) {
this.itemChangeSubject.next({ item, event });
}
내 테스트 는 예상대로 switchMap
내 에서 첫 번째를 실행 ngOnInit
하지만 탭 부작용이나 다음 switchMap은 실행되지 않습니다. 첫 번째 체인이 아닌 전체 체인을 테스트 할 수 있도록 테스트를 수정하려면 어떻게 switchMap
해야합니까? 또한 탭 또는 오류 블록을 테스트해야합니까? 나는 서비스를 호출하기 때문에 최종 switchMap에 대해 주로 우려합니다.
나는 그것이 changeItemStatus: of()
.
return fromArray(args as T[]);
결국 도달 할 것입니다 subscribeToArray
:
export const subscribeToArray = <T>(array: ArrayLike<T>) => (subscriber: Subscriber<T>) => {
for (let i = 0, len = array.length; i < len && !subscriber.closed; i++) {
subscriber.next(array[i]);
}
subscriber.complete();
};
따라서 위 of()
의 array
를 사용 하면 비어 있으며 Observable이 아무것도 방출하지 않음을 의미합니다. 결과적으로 체인의 다음 운영자에게 도달하지 않습니다.
바꿀 경우 작동합니다 of()
함께 of(null)
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다