如何对茉莉花进行OidcSecurityService.Auth单元测试?

问题描述

我正在使用Jasmine进行单元测试。我正在使用OidcSecurityService。所以我为此做了一个模拟:

export class OidcSecurityServiceStub{
  getToken(){
     return 'some_token_eVbnasdQ324';
  }
}

我有这个组件:

export class AutoLoginComponent implements OnInit {
  lang: any;

  constructor(public oidcSecurityService: OidcSecurityService) {}

  /**
   * responsible that user will be redirected to login screen.
   */
  ngOnInit() {
      this.oidcSecurityService.checkAuth().subscribe(() => this.oidcSecurityService.authorize());
  }

}

以及现在的规格:

describe('AutoLoginComponent',() => {
  let component: AutoLoginComponent;
  let fixture: ComponentFixture<AutoLoginComponent>;

  beforeEach(async(() => {
    Testbed.configureTestingModule({
      declarations: [ AutoLoginComponent ],providers:    [ {provide: OidcSecurityService,useClass: OidcSecurityServiceStub} ]
    })
    .compileComponents();
  }));

  beforeEach(() => {
    fixture = Testbed.createComponent(AutoLoginComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should create autologin component ',() => {

    const fixture  = Testbed.createComponent(AutoLoginComponent);
    expect(component).toBeTruthy();
  });
});

但是我得到这个错误

NullInjectorError: R3InjectorError(DynamicTestModule)[OidcSecurityService -> OidcSecurityService]: 
  NullInjectorError: No provider for OidcSecurityService!

那我要改变什么?

谢谢

所以我做了这个改变:

import { AuthOptions } from 'angular-auth-oidc-client/lib/login/auth-options';
import { of } from 'rxjs';

export class OidcSecurityServiceStub {
  getToken() {
    return 'some_token_eVbnasdQ324';
  }

  checkAuth(url: string) {
    return of(url);
  }

  authorize(authOptions?: AuthOptions){
    return authOptions.urlHandler('http://localhost');
  }
}

但随后出现此错误

Afterall TypeError: Cannot read property 'urlHandler' of undefined

解决方法

在您的ngOnInit中,您正在调用authorize而没有任何参数,当它调用存根的authorize时,它是未定义的。

您可以尝试将模拟更改为类似以下内容:

import { AuthOptions } from 'angular-auth-oidc-client/lib/login/auth-options';
import { of } from 'rxjs';

export class OidcSecurityServiceStub {
  getToken() {
    return 'some_token_eVbnasdQ324';
  }

  checkAuth(url: string) {
    return of(url);
  }

  authorize(authOptions?: AuthOptions){
    if (authOptions) {
      return authOptions.urlHandler('http://localhost');
    } else {
      return null;
    }
  }
}