我正在编写一个测试用例来测试每次调用该操作时刷新 token 的效果。 我创建了一个模拟服务来模拟我的效果实际调用的端点的响应。这是测试。
import { JwtHelperService } from '@auth0/angular-jwt';
import { Observable, of } from "rxjs";
import { AuthEffects } from './auth.effects';
import { provideMockActions } from '@ngrx/effects/testing';
import { AuthService } from '../services/AuthService.service';
import { TestBed } from '@angular/core/testing';
import { AuthActions } from './action-types';
const newToken = "Bearer : 123456789";
class MockService {
refreshToken ( ) {
return of(newToken);
}
}
describe('AuthEffects', () => {
let actions$: Observable<any>;
let effects: AuthEffects;
let httpService: AuthService;
let jwtHelper: JwtHelperService;
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
AuthEffects,
provideMockActions(() => actions$),
[{ provide: AuthService, useValue: MockService }],
[{ provide: JwtHelperService, useValue: MockService }],
],
});
effects = TestBed.get(AuthEffects);
httpService = TestBed.get(AuthService);
jwtHelper = TestBed.get(JwtHelperService);
});
describe('refreshToken$', () => {
it('should hit refresh token api ', (done) => {
const spy = spyOn(httpService, 'refreshToken').and.callThrough();
actions$ = of(AuthActions.refreshToken);
effects.refreshToken$.subscribe((res) => {
expect(res).toEqual(AuthActions.tokenRefreshSuccessful({ newToken }));
expect(spy).toHaveBeenCalledTimes(1);
done();
});
});
});
});
我测试的效果是这样的
refreshToken$ = createEffect(
() => this.actions$.pipe(
ofType(AuthActions.refreshToken),
concatMap((action) => this.authService.refreshToken(action.oldToken)),
map(newToken => {
return AuthActions.tokenRefreshSuccessful({ newToken })
}),
catchError((error) => {
return of(AuthActions.tokenRefreshFail(error))
})
)
);
运行测试用例时遇到的问题是这样的
Error: <spyOn> : refreshToken() method does not exist
Usage: spyOn(<object>, <methodName>)
最佳答案
发现问题了。我使用 useValue 而不是 useClass 来注入(inject)服务
关于rxjs - spy 方法返回错误 "method does not exist",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62502411/