Angular + Jasmine:如何忽略/模拟被测组件(不在依赖项中)中的一个函数?
Angular + Jasmine: How to ignore/ mock one function in the tested component (not in a dependency)?
我知道如何从依赖项模拟函数,但现在我有一个不在依赖项中的函数,它在我要测试的实际组件中。我怎样才能告诉茉莉花简单地忽略它?
当我运行ng test
这个测试失败时:
原因是我从外部库导入的这个函数:
import { documentToHtmlString } from '@contentful/rich-text-html-renderer';
(Contentful 是我在项目中使用的内容管理服务。)
在我的组件中,此函数在此处被调用:
ngOnInit() {
//the next line keeps the test from creating, I don't really care to test this function, how can I mock it?:
this.serializeContentfulRichText(someContentfulTextDoesntMatter);
// a lot more stuff that I actually need to test
...
}
serializeContentfulRichText(contentfulText: any) {
return documentToHtmlString(contentfulText, this.myRenderingOptions);
}
当我删除 documentToHtmlString
行并且 return 为 null 时,其余测试工作正常,我可以测试我的整个组件。但是我当然不能在我的实际组件中删除这一行,我只想在我的测试中ignore/mock它。
我用 spy 试了一下:
it('should create', () => {
let spy = spyOn(component, 'serializeContentfulRichText')
expect(spy).toHaveBeenCalledTimes(1)
expect(component).toBeTruthy();
});
但是间谍没有被调用,组件也没有被创建(两个预期都失败了)。
如果要对测试组件的方法进行存根,则需要在 TestBed.createComponent
之后但在 fixture.detectChanges()
.
之前进行
在这种情况下,只执行了组件的构造函数,没有执行生命周期钩子。
it('should create', () => {
// initialization
const fixture = TestBed.createComponent(DeclarationScrolltextComponent);
const component = fixture.componentInstance;
expect(component).toBeTruthy();
// installing spies
const spy = spyOn(component, 'serializeContentfulRichText');
// executing render
fixture.detectChanges();
// assertions
expect(spy).toHaveBeenCalledTimes(1);
});
我知道如何从依赖项模拟函数,但现在我有一个不在依赖项中的函数,它在我要测试的实际组件中。我怎样才能告诉茉莉花简单地忽略它?
当我运行ng test
这个测试失败时:
原因是我从外部库导入的这个函数:
import { documentToHtmlString } from '@contentful/rich-text-html-renderer';
(Contentful 是我在项目中使用的内容管理服务。)
在我的组件中,此函数在此处被调用:
ngOnInit() {
//the next line keeps the test from creating, I don't really care to test this function, how can I mock it?:
this.serializeContentfulRichText(someContentfulTextDoesntMatter);
// a lot more stuff that I actually need to test
...
}
serializeContentfulRichText(contentfulText: any) {
return documentToHtmlString(contentfulText, this.myRenderingOptions);
}
当我删除 documentToHtmlString
行并且 return 为 null 时,其余测试工作正常,我可以测试我的整个组件。但是我当然不能在我的实际组件中删除这一行,我只想在我的测试中ignore/mock它。
我用 spy 试了一下:
it('should create', () => {
let spy = spyOn(component, 'serializeContentfulRichText')
expect(spy).toHaveBeenCalledTimes(1)
expect(component).toBeTruthy();
});
但是间谍没有被调用,组件也没有被创建(两个预期都失败了)。
如果要对测试组件的方法进行存根,则需要在 TestBed.createComponent
之后但在 fixture.detectChanges()
.
在这种情况下,只执行了组件的构造函数,没有执行生命周期钩子。
it('should create', () => {
// initialization
const fixture = TestBed.createComponent(DeclarationScrolltextComponent);
const component = fixture.componentInstance;
expect(component).toBeTruthy();
// installing spies
const spy = spyOn(component, 'serializeContentfulRichText');
// executing render
fixture.detectChanges();
// assertions
expect(spy).toHaveBeenCalledTimes(1);
});