簡體   English   中英

Angular單元測試模擬服務

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM