Угловой тест спецификации StaticInjectorError

#angular #angular-test

#угловой #angular-тест

Вопрос:

Обычно я получаю следующую ошибку, если я не включил зависимость в свой тестовый стенд, которая требуется конструктору тестируемого класса. Но в этом случае отсутствующая зависимость — это класс, который я тестирую.

Ошибка

 Error: StaticInjectorError[AuthGuardService]: 
      NullInjectorError: No provider for AuthGuardService!
  

Вопрос:

Что мне нужно добавить, чтобы тест прошел?

Спецификация AuthGuardService

 import {TestBed} from '@angular/core/testing';
import {AuthGuardService} from './auth-guard.service';
import {UserService} from '../user/user.service';
import {Router} from '@angular/router';
import {RouterTestingModule} from '@angular/router/testing';

describe('AuthGuardService', () => {
  beforeEach(() => {
    const userServiceSpy = jasmine.createSpyObj('UserService', ['isAuthenticated']);
    const routerServiceSpy = jasmine.createSpyObj('RouterService', ['navigate']);
    TestBed.configureTestingModule({
      imports: [
        RouterTestingModule
      ],
      providers: [
        {provide: UserService, useValue: userServiceSpy},
        {provide: Router, useValue: routerServiceSpy}
      ]
    });
  });

  it('should be created', () => {
    const service: AuthGuardService = TestBed.get(AuthGuardService);
    expect(service).toBeTruthy();
  });
});
  

AuthGuardService

 import {Injectable} from '@angular/core';
import {Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot} from '@angular/router';
import {UserService} from '../user/user.service';

@Injectable()
export class AuthGuardService implements CanActivate {
  constructor(private userService: UserService, private router: Router) {
  }

  async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
    const authStatus = await this.userService.isAuthenticated();
    if (authStatus === true) {
      return true;
    }
    this.router.navigate(['front'], {queryParams: {returnUrl: state.url}});
    return false;
  }
}
  

Комментарии:

1. У AuthGuardService нет собственного поставщика. Попробуйте предоставить сервис на вашем тестовом стенде.

2. Это потому, что это не так @Injectable({ providedIn: 'root' }) ? Итак, мне просто нужно добавить providers: [AuthGuardService] в Testbed , верно?

3. Хорошо, это сработало thx.