[英]Angular unit test mocking a service
我想对组件的功能进行单元测试。 因此,我需要模拟服务(根据角度测试指南 )。
这是我的TestBed:
TestBed.configureTestingModule({
declarations: [LanguageSelectorComponent],
providers: [
{ provide: LanguageSelectorService, useValue: userServiceStub }]
});
这是我的userServiceStub:
let userServiceStub: Partial<LanguageSelectorService>;
userServiceStub = {
_languages:
[
{
ID: '',
Name: '',
ImageSrc: ''
},
{
ID: '',
Name: '',
ImageSrc: ''
}
]
};
但是起初“ _language”是私有财产,因此在这里找不到。 第二,当我将其更改为public时,仍然在userServiceStub上收到错误消息:
[ts]键入'{_语言:{ID:字符串; 名称:字符串; ImageSrc:字符串; } []; }”不可分配给“部分”类型。 属性“ _languages”的类型不兼容。 输入'{ID:string; 名称:字符串; ImageSrc:字符串; } []'不可分配给'Observable'类型。 类型'{ID:string;类型中缺少属性'_isScalar'。 名称:字符串; ImageSrc:字符串; } []'。 让userServiceStub:部分
那么模拟服务值的正确方法是什么?
坦率
服务代码:
@Injectable() export class LanguageSelectorService { _projectsUrl = 'languages.json'; _configurationtemplatesUrl = 'configurationtemplates.json'; _configurationtemplatePDFUrl = 'configurationtemplatePDF.json'; _baseUrl: string; public _languages: Observable<ILanguage[]>; constructor(private _http: HttpClient, private _logger: NGXLogger) { this._baseUrl = '../../api'; this._languages = this._http .get<ILanguage[]>(`${this._baseUrl}/${this._projectsUrl}`); } getLanguages(): Observable<ILanguage[]> { return this._languages; } }
您对_languages属性的模拟不好,因为它是一个Observable ,而不是一个数组。 您应该这样做:
let userServiceStub: Partial<LanguageSelectorService>;
userServiceStub = {
_languages: Observable.of( // or simply of() if you are using new rxjs piepeable version
[
{
ID: '',
Name: '',
ImageSrc: ''
},
{
ID: '',
Name: '',
ImageSrc: ''
}
]
)
};
这应该可行,并且不会给您任何错误。 当然,您必须对其进行.sbuscribe()才能获取数组值,但是它是同步的,因此您不必为此担心。
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.