角度单元测试模拟服务

时间:2018-04-09 13:36:00

标签: angular unit-testing mocking

我想单元测试组件的功能。 因此,我需要一个模拟服务(根据angular testing guide)。

这是我的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]   输入'{_languages:{ID:string;名称:字符串; ImageSrc:string; } []; }'不能指定为'Partial'类型。     属性'_languages'的类型是不兼容的。       输入'{ID:string;名称:字符串; ImageSrc:string; } []'不能赋值为'Observable'。         类型'{ID:string;中缺少属性'_isScalar';名称:字符串; ImageSrc:string; } []”。   让userServiceStub:Partial

那么模拟服务价值的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

服务代码:

&#13;
&#13;
2.2.0
&#13;
&#13;
&#13;

答案 1 :(得分:0)

你并没有很好地嘲笑_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(),但它是同步的,所以你不必担心这一点。

希望这有帮助。