【问题标题】:angular TestBed mock service角度测试床模拟服务
【发布时间】:2020-06-24 20:31:54
【问题描述】:

我想在 NGXS 中测试一个动作,但由于我需要模拟的服务而失败。谷歌搜索发现有多种方法可以模拟服务。

测试

describe('UserState', () => {
    let store: Store;

    beforeEach(() => {
        TestBed.configureTestingModule({
            imports: [
                NgxsModule.forRoot([UserState]),
                HttpClientModule,
                AngularFireModule.initializeApp(environment.firebase),
                AngularFirestoreModule,
                AngularFireAuthModule
            ],
            providers: [{provide: DatabaseService, useValue: {updateUserField: of(1)}}]
        });

        store = TestBed.get(Store);
    });

    it('should update user settings', () => {
        store.dispatch(new UpdateUserSettingsAction({alias: 'Naruto'} as Settings));
        const userModel: UserModel = store.selectSnapshot(state => state.user);
        expect(userModel.settings).toBeDefined();
    });
});

动作

  @Action(UpdateUserSettingsAction)
    updateUserSettings(ctx: StateContext<UserModel>, action: UpdateUserSettingsAction) {
        const user = ctx.getState();
        return this.databaseService.updateUserField('settings', action.settings)
            .pipe(
                first(),
                tap(() => {
                    ctx.setState({
                        ...user,
                        settings: action.settings
                    });
                })
            );
    }

错误

this.databaseService.updateUserField is not a function

你看到我的错误了吗?

【问题讨论】:

    标签: angular testing ngxs


    【解决方案1】:

    问题是 updateUserField 在你的真实服务中是一个函数,但在你的模拟中它只是一个属性。以下更改应该使它起作用:

    providers: [{provide: DatabaseService, useValue: {updateUserField: () => of(1) }}]
    

    我所做的只是添加了() =&gt;,这样它就变成了一个返回你的of(1)的函数

    【讨论】:

      猜你喜欢
      • 2021-06-19
      • 2016-01-09
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-26
      • 1970-01-01
      相关资源
      最近更新 更多