如何使用订阅测试组件
How to test a component with subscription
在 Jasmine/Karma 的组件中使用订阅进行单元测试
我正在尝试测试 ngOninit 是否在我的页面中很好地生成了元标记:
ngOnInit(): void {
this.pagesSub = this.pagesService.initPage().subscribe();
}
这是我的 InitPage 函数:
initPage(): Observable<Page> {
return this.pageDbService.data$.pipe(
map((pages: Page[]) => {
let currentPage: Page;
if (pages.length > 0) {
this.setPagesToStore(pages);
if (this.router.url === '/') {
currentPage = pages[0]
} else {
currentPage = pages.find(page => ('/' + page.pageId) === this.router.url)
}
} else {
this.setPagesToStore(pagesSeed);
if (this.router.url === '/') {
currentPage = pagesSeed[0]
} else {
currentPage = pagesSeed.find(page => ('/' + page.pageId) === this.router.url)
}
}
this.seoService.generatePageTags(currentPage);
return currentPage;
})
)
}
这是 generatePageTags 函数:
generatePageTags(page: Page) {
const pageTitle = `${page.pageTitle} - IZIprint`;
this.titleService.setTitle(pageTitle);
this.meta.updateTag({ name: 'robots', content: 'index,follow' });
this.meta.updateTag({ name: 'description', content: page.description });
this.meta.updateTag({ property: 'og:type', content: 'website' });
this.meta.updateTag({ property: 'og:title', content: page.socialTitle });
this.meta.updateTag({ property: 'og:description', content: page.description });
this.meta.updateTag({ property: 'og:url', content: page.ogUrl });
this.meta.updateTag({ property: 'og:image', content: page.socialImage.thumbUrl });
this.meta.updateTag({ property: 'og:determiner', content: 'auto' });
this.meta.updateTag({ property: 'og:locale', content: 'fr_FR' });
this.meta.updateTag({ property: 'og:site_name', content: 'IZIprint' });
this.meta.updateTag({ name: 'twitter:card', content: 'summary_large_image' });
this.meta.updateTag({ name: 'twitter:title', content: page.socialTitle });
this.meta.updateTag({ name: 'twitter:description', content: page.description });
this.meta.updateTag({ name: 'twitter:image', content: page.socialImage.thumbUrl });
}
如果我用这个测试测试:
it(`should have a metatag property="og:site_name" with content='IZIprint'`, fakeAsync(() => {
meta = TestBed.inject(Meta);
component.ngOnInit();
fixture.detectChanges();
flush();
expect(meta.getTag('property="og:site_name"').content).toBe('IZIprint');
}));
Jasmine-Karma 在我的页面中找不到 'property="og:site_name"' 的内容。
我是测试新手。请问我的错误在哪里?
如果 pageDbService.data$.
有合适的模拟,下面的代码应该足够了:
it(`should have a metatag property="og:site_name" with content='IZIprint'`, async () => {
component.ngOnInit();
await fixture.whenStable()
meta = TestBed.inject(Meta);
expect(meta.getTag('property="og:site_name"').content).toBe('IZIprint');
});
fixture.detectChanges();
触发 ngOnInit
生命周期钩子。无需将它们都称为。 detectChanges
还会触发变化检测和渲染。该测试不依赖于其中任何一个。 ngOnInit
就够了。
问题是 pageDbService.data$
模拟。我没有看到它的代码,所以我不能说这个模拟设置是否正确。
在 Jasmine/Karma 的组件中使用订阅进行单元测试 我正在尝试测试 ngOninit 是否在我的页面中很好地生成了元标记:
ngOnInit(): void {
this.pagesSub = this.pagesService.initPage().subscribe();
}
这是我的 InitPage 函数:
initPage(): Observable<Page> {
return this.pageDbService.data$.pipe(
map((pages: Page[]) => {
let currentPage: Page;
if (pages.length > 0) {
this.setPagesToStore(pages);
if (this.router.url === '/') {
currentPage = pages[0]
} else {
currentPage = pages.find(page => ('/' + page.pageId) === this.router.url)
}
} else {
this.setPagesToStore(pagesSeed);
if (this.router.url === '/') {
currentPage = pagesSeed[0]
} else {
currentPage = pagesSeed.find(page => ('/' + page.pageId) === this.router.url)
}
}
this.seoService.generatePageTags(currentPage);
return currentPage;
})
)
}
这是 generatePageTags 函数:
generatePageTags(page: Page) {
const pageTitle = `${page.pageTitle} - IZIprint`;
this.titleService.setTitle(pageTitle);
this.meta.updateTag({ name: 'robots', content: 'index,follow' });
this.meta.updateTag({ name: 'description', content: page.description });
this.meta.updateTag({ property: 'og:type', content: 'website' });
this.meta.updateTag({ property: 'og:title', content: page.socialTitle });
this.meta.updateTag({ property: 'og:description', content: page.description });
this.meta.updateTag({ property: 'og:url', content: page.ogUrl });
this.meta.updateTag({ property: 'og:image', content: page.socialImage.thumbUrl });
this.meta.updateTag({ property: 'og:determiner', content: 'auto' });
this.meta.updateTag({ property: 'og:locale', content: 'fr_FR' });
this.meta.updateTag({ property: 'og:site_name', content: 'IZIprint' });
this.meta.updateTag({ name: 'twitter:card', content: 'summary_large_image' });
this.meta.updateTag({ name: 'twitter:title', content: page.socialTitle });
this.meta.updateTag({ name: 'twitter:description', content: page.description });
this.meta.updateTag({ name: 'twitter:image', content: page.socialImage.thumbUrl });
}
如果我用这个测试测试:
it(`should have a metatag property="og:site_name" with content='IZIprint'`, fakeAsync(() => {
meta = TestBed.inject(Meta);
component.ngOnInit();
fixture.detectChanges();
flush();
expect(meta.getTag('property="og:site_name"').content).toBe('IZIprint');
}));
Jasmine-Karma 在我的页面中找不到 'property="og:site_name"' 的内容。 我是测试新手。请问我的错误在哪里?
如果 pageDbService.data$.
有合适的模拟,下面的代码应该足够了:
it(`should have a metatag property="og:site_name" with content='IZIprint'`, async () => {
component.ngOnInit();
await fixture.whenStable()
meta = TestBed.inject(Meta);
expect(meta.getTag('property="og:site_name"').content).toBe('IZIprint');
});
fixture.detectChanges();
触发 ngOnInit
生命周期钩子。无需将它们都称为。 detectChanges
还会触发变化检测和渲染。该测试不依赖于其中任何一个。 ngOnInit
就够了。
问题是 pageDbService.data$
模拟。我没有看到它的代码,所以我不能说这个模拟设置是否正确。