我想测试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
您看到我的错误了吗?
答案 0 :(得分:1)
问题在于updateUserField是您的真实服务中的一个函数,但在您的模拟中它只是一个属性。以下更改应使其起作用:
providers: [{provide: DatabaseService, useValue: {updateUserField: () => of(1) }}]
我所做的只是添加了() =>
,这样它就变成了返回您的of(1)
的函数