angular тестовый сервис TestBed - PullRequest
0 голосов
/ 12 марта 2020

Я хочу протестировать действие в 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

Вы видите мою ошибку?

1 Ответ

1 голос
/ 12 марта 2020

Проблема в том, что updateUserField - это функция в вашем реальном сервисе, но в вашем макете это просто свойство. Следующее изменение должно заставить его работать:

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

Все, что я сделал, это добавил () =>, чтобы он стал функцией, которая возвращает of(1)

...