【发布时间】:2023-03-16 22:00:02
【问题描述】:
我想用 jasmine-marble 测试来测试 Observable,但不幸的是我不知道如何触发 ngIf 的更改检测,这应该呈现组件。
这是我的课程的简化版本:
export class MyComponent implements OnInit {
data$: Observable<{data: any[]}>;
constructor(private baseService: BaseService) { }
ngOnInit(): void {
this.data$ = this.baseService.get(endpoint);
}
}
还有我的html文件:
<custom-component *ngIf="data$ | async as value" [data]="value.data">
...
</custom-component>
这是我当前的测试,失败了:
it ('should display custom component', fakeAsync(() => {
const expected = cold('a|', {a: {data: [{id: 1}]}});
baseServiceStub.get.and.returnValue(expected);
component.ngOnInit();
fixture.detectChanges();
tick();
expect(component.data$).toBeObservable(expected); // this passes and the observable also holds the correct value
expect(baseService.get).toHaveBeenCalledWith(endpoint); // this passes aswell
component.data$.subscribe(val => {
console.log(val); // here I can log the correct value of the observable ( {data: [{id:1}]})
});
expect(fixture.debugElement.query(By.css('custom-component'))).not.toBeNull(); // this fails
}));
不幸的是我得到的都是这个
Error: Expected null not to be null.
服务或可观察对象本身没有问题,但在我看来,由于某种原因,DOM 不会触发使用异步管道来渲染组件的更改检测。
PS:当我使用getTestScheduler().flush() 时,我得到了错误Can't subscribe to undefined。
【问题讨论】:
-
请添加一个 stackblitz 示例,您说服务和 observable 都没有问题。但是,我不相信你的话:)
-
不应该吗?
baseServiceStub.get.and.returnValue(of({data: [{id: 1}]}));来自 rxjs? -
这是我当前的 StackBlitz stackblitz.com/edit/jasmine-in-angular-phifhp?file=src/app/… 。出于某种原因,由于格式问题,StackOverflow 不允许我编辑我的帖子...
标签: angular angular-test jasmine-marbles