Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ReferenceError: Cannot access Service' before initialization

Im getting an error when i run a unit test with jasmine on angular8 app. I have a service and inside this service im injecting another service

@Injectable({
  providedIn: 'root'
})

export class FirstService {
  constructor(private http: HttpClient, private configService: ConfigurationService) { }

when i do npm run test i always got an error:

An error was thrown in afterAll ReferenceError: Cannot access 'ConfigurationService' before initialization at Module.ConfigurationService (http://localhost:9876/_karma_webpack_/main.js:1095:112)

Any help?

like image 330
faoc Avatar asked Jan 09 '20 14:01

faoc


People also ask

How to fix Cannot access before initialization?

The "Cannot access before initialization" error occurs when a variable declared using let or const is accessed before it was initialized in the scope. To solve the error, make sure to initialize the variable before accessing it.

Can t access lexical declaration users before initialization?

The JavaScript exception "can't access lexical declaration `variable' before initialization" occurs when a lexical variable was accessed before it was initialized. This happens within any block statement, when let or const variables are accessed before the line in which they are declared is executed.


2 Answers

You would need to provide a mock of ConfigService because it is a dependency of FirstService. The easiest way to do that is with a spy.

Something like:

let firstService: FirstServicec;
let configServiceSpy: jasmine.SpyObj<ConfigService>;

beforeEach(() => {
  const spy = jasmine.createSpyObj('ConfigService', ['getValue']);

  TestBed.configureTestingModule({
    providers: [
      FirstService,
      { provide: ConfigService, useValue: spy }
    ]
  });
  // Inject both the service-to-test and its (spy) dependency
  configService = TestBed.get(ConfigService);
  configServiceSpy = TestBed.get(ValueService);
});

Then, you can consume the spy in the test like:

it('#getValue should return stubbed value from a spy', () => {
  const stubValue = 'stub value';
  configServiceSpy.getValue.and.returnValue(stubValue);

  expect(firstService.getValue())
    .toBe(stubValue, 'service returned stub value');
  expect(configServiceSpy.getValue.calls.count())
    .toBe(1, 'spy method was called once');
  expect(configServiceSpy.getValue.calls.mostRecent().returnValue)
    .toBe(stubValue);
});

For more information, check out this section of the Angular Docs

like image 92
Kyler Johnson Avatar answered Dec 01 '22 04:12

Kyler Johnson


This can be a very misleading error message.

A circular dependency may be causing it, solve your circular dependencies!

You will not see a circular dependency warning when running 'npm run test', but you will get a warning when running 'npm run serve' or 'npm run build'.

like image 25
trevorcroft Avatar answered Dec 01 '22 06:12

trevorcroft