繁体   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