[英]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.