gpt4 book ai didi

angular - 在带有单元测试 angular + jasmine 和 SpyOn 的 switchMap 中永远不会调用函数

转载 作者:行者123 更新时间:2023-12-04 11:41:48 25 4
gpt4 key购买 nike

我正在尝试进行测试以了解是否调用了服务的函数,但它始终返回未调用的我。我不知道我做错了什么。
我想知道它是否在 switchMap 中调用的函数,这个函数是一个服务。 (this.heroSearchService.search(term))

这是显示 Expected spy search to have been called. 的消息

这是我的组件。

export class HeroSearchComponent implements OnInit {
heroes: Observable<Hero[]>;
private searchTerms = new Subject<string>();

constructor(
private heroSearchService: HeroSearchService
) {}

search(term: string): void {
// Push a search term into the observable stream.
this.searchTerms.next(term);
}

ngOnInit(): void {
this.heroes = this.searchTerms.pipe(
debounceTime(300), // wait for 300ms pause in events
distinctUntilChanged(), // ignore if next search term is same as previous
switchMap(term => term ? this.heroSearchService.search(term) : of<Hero[]>([])),
catchError(error => {
// TODO: real error handling
console.log(`Error in component ... ${error}`);
return of<Hero[]>([]);
})
);
}
}

这是我的模拟服务。
export const MockHeroSearchService = {
search: (term: string): Observable<Array<Hero>> => {
let heroes = defaultHeroes.filter(hero => hero.name.includes(term)) as Array<Hero>;
return of(heroes);
}
}

这是我的测试文件。在这个文件中,我创建了 spy ( spyOn(heroSearchService, 'search').and.callThrough(); )的测试和失败的期望是 expect(heroSearchService.search).toHaveBeenCalled();
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [CommonModule, HttpClientTestingModule, RouterTestingModule, FormsModule], //If our component uses routing, httpclient
declarations: [HeroSearchComponent], //Here we put all the components that use our component.
providers: [
//Here we can inject the dependencies that our component needs.
//If our dependecies are services, we can create a simulated service.
{ provide: HeroSearchService, useValue: MockHeroSearchService },
]
}).compileComponents();
}));

//Arrange
beforeEach(() => {
heroSearchService = TestBed.get(HeroSearchService);
fixture = TestBed.createComponent(HeroSearchComponent);
debugElement = fixture.debugElement;
heroSearchComponent = fixture.componentInstance;
//fixture.detectChanges();// Comments, so that it does run the of method ngOnInit();
});

fit('should with the correct search term, the variable heros have at least a hero', fakeAsync(() => {
spyOn(heroSearchService, 'search').and.callThrough();
fixture.detectChanges();

const input = fixture.debugElement.query(By.css('#search-box'));
input.nativeElement.value = 'And';
input.triggerEventHandler('keyup', null);

tick(600);
fixture.detectChanges();

expect(heroSearchService.search).toHaveBeenCalled();
}));

我也运行代码覆盖率,这是结果。 where is 显示该行正在执行。

enter image description here

我希望你能帮助我。请原谅我的英语。

最佳答案

恢复这个相当古老的威胁,因为我遇到了相同/类似的问题。您是否已经能够找到解决方案?
在我的情况下 - 由于记录中间值 - 我可以验证 ids$ Observable 是否正在触发。

this.testObs$ = this.ids$.pipe(
switchMap(ids => {
const promises = ids.map(id => {
return this.testApi.getPayer(id).toPromise();
});
return Promise.all(promises);
})
);

关于angular - 在带有单元测试 angular + jasmine 和 SpyOn 的 switchMap 中永远不会调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52412780/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com