diff --git a/projects/testing-library/src/lib/testing-library.ts b/projects/testing-library/src/lib/testing-library.ts index f498a89..b4e4d77 100644 --- a/projects/testing-library/src/lib/testing-library.ts +++ b/projects/testing-library/src/lib/testing-library.ts @@ -42,6 +42,14 @@ type SubscribedOutput = readonly [key: keyof T, callback: (v: any) => void, s const mountedFixtures = new Set>(); const safeInject = TestBed.inject || TestBed.get; +export function getInstanceWithProviders(serviceClass: Type, providers: any[]): T { + TestBed.configureTestingModule({ + providers: [serviceClass, ...providers], + }); + + return TestBed.inject(serviceClass); +} + export async function render( component: Type, renderOptions?: RenderComponentOptions, diff --git a/projects/testing-library/tests/getInstanceWithProviders.spec.ts b/projects/testing-library/tests/getInstanceWithProviders.spec.ts new file mode 100644 index 0000000..b26a992 --- /dev/null +++ b/projects/testing-library/tests/getInstanceWithProviders.spec.ts @@ -0,0 +1,28 @@ +import { Injectable } from '@angular/core'; +import { getInstanceWithProviders } from '../src/lib/testing-library'; + +describe('getInstanceWithProviders', () => { + @Injectable() + class DatabaseService { + getData() { + return 'real data'; + } + } + + @Injectable() + class UserService { + constructor(private db: DatabaseService) {} + + getUser() { + return `User: ${this.db.getData()}`; + } + } + + it('should inject a mock service into a service that depends on it', () => { + const mockDatabase = { getData: () => 'mock data' }; + + const userService = getInstanceWithProviders(UserService, [{ provide: DatabaseService, useValue: mockDatabase }]); + + expect(userService.getUser()).toBe('User: mock data'); + }); +});