rxjs - spy 方法返回错误 "method does not exist"

标签 rxjs jasmine karma-jasmine

我正在编写一个测试用例来测试每次调用该操作时刷新 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/

相关文章:

javascript - 如何在 RxJS(或 Reactive Extensions 中的通用)中实现时间过期热观察

javascript - 使用 HttpInterceptor 刷新并行 HTTP 请求的 token

javascript - Jasmine ,AngularJS : Unit test a function which returns a value after timeout

javascript - 你们能帮我用 jasmine 为下面的代码编写测试用例吗

带路由器的 Angular 2 测试

redux - 史诗不会对另一个史诗的 Action 使用react

Angular 2 Http重试时间

javascript - 如何测试指令是否发出事件

android - 无法在 Android 模拟器上运行 Protractor 脚本

angular - 如何更改使用 Angular Material 选项卡的组件的单元测试中的选项卡