簡體   English   中英

角度測試床模擬服務

[英]angular TestBed mock service

我想在 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

你看到我的錯誤了嗎?

問題是 updateUserField 是您實際服務中的一個函數,但在您的模擬中它只是一個屬性。 以下更改應使其工作:

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

我所做的只是添加了() => ,以便它成為一個返回您的of(1)的函數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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