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?
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.
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.
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
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'.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With