Then inject it inside a test by calling TestBed.get() with the service class as the argument.
it('should use ValueService', () => {
service = TestBed.get(ValueService);
expect(service.getValue()).toBe('real value');
});
When testing a service with a dependency, provide the mock in the providers array.
let masterService: MasterService;
let valueServiceSpy: jasmine.SpyObj<ValueService>;
beforeEach(() => {
const spy = jasmine.createSpyObj('ValueService', ['getValue']);
TestBed.configureTestingModule({
// Provide both the service-to-test and its (spy) dependency
providers: [
MasterService,
{ provide: ValueService, useValue: spy }
]
});
// Inject both the service-to-test and its (spy) dependency
masterService = TestBed.get(MasterService);
valueServiceSpy = TestBed.get(ValueService);
});
it('#getValue should return stubbed value from a spy', () => {
const stubValue = 'stub value';
valueServiceSpy.getValue.and.returnValue(stubValue);
expect(masterService.getValue())
.toBe(stubValue, 'service returned stub value');
expect(valueServiceSpy.getValue.calls.count())
.toBe(1, 'spy method was called once');
expect(valueServiceSpy.getValue.calls.mostRecent().returnValue)
.toBe(stubValue);
});
For the
serviceSpy
please check this blogService in the Component
spec
file inside theproviders
Service alone for testing
Services
are often the easiest files to unit test.Testing with
Observable
andPromise
needsdone( )
.Testing services with the TestBed
The
TestBed
creates a dynamically-constructed Angular test module that emulates an Angular @NgModule.The
TestBed.configureTestingModule()
method takes a metadata object that can have most of the properties of an @NgModule.Then inject it inside a test by calling
TestBed.get()
with the service class as the argument.When testing a service with a dependency, provide the mock in the
providers array
.