2
votes

I have a service which I would like to test:

@Injectable()
export class AuthenticationService {
  initialAuthStatus = this.authenticationStatus.first();

  constructor(private adalService: AdalService,
              private settingsProvider: SettingsProvider) { }


  public get authenticationStatus(): any {
    return this.adalService.userInfo.authenticationStatus;
  }
}

And a test for the service:

describe('AuthenticationService', () => {
    let mockAdalService: any;
    let adalService: any;
    let service: any;
    let mockSettingsProvider: any;
    beforeEach(() => {
        TestBed.configureTestingModule({
          providers: [
            AuthenticationService, 
            AdalService,
            { provide: SettingsProvider, useClass: MockSettingsProvider },
            { provide: AdalService, useClass: MockAdalService }
          ]
        });

        mockAdalService = new MockAdalService();
        adalService = new AdalService();
        mockSettingsProvider = new MockSettingsProvider();
    });

    it('should be created', inject([AuthenticationService], (service: AuthenticationService) => {
        expect(service).toBeTruthy();
    }));
});

However, the test fails with the following error message:

AuthenticationService should be created
TypeError: Cannot read property 'authenticationStatus' of undefined

It has something to do with the getter of authentication status, but I can't figure out exactly why it fails.

Any help is greatly appreciated :)

1
Error comes from this line : initialAuthStatus = this.authenticationStatus.first(); it's hasn't been initialized at that pointVega
How can I solve it?dave0688
put it in the constructor or ngOnInit and leave just initialAuthStatus at the topVega
Wow, ok I was really blind. I've put it in ngOnInit now (constructor didn't work), and it works now. Thanks a log :) Please write a post so that I can mark it as the answer.dave0688

1 Answers

1
votes

At the top of the class, in this line, where you declare the class property initialAuthStatus:

initialAuthStatus = this.authenticationStatus.first();

this.authenticationStatus hasn't been initialized yet, gives you the error message. To make it work, put that line in ngOnInit() method and keep pure declaration part at the top of the class.

initialAuthStatus;
...
ngOnInit(){
    this.initialAuthStatus = this.authenticationStatus;
}
...
...