Bird
Raised Fist0
Angularframework~20 mins

Service testing with dependency injection in Angular - Practice Problems & Coding Challenges

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Challenge - 5 Problems
🎖️
Service Testing Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
component_behavior
intermediate
2:00remaining
What is the output of this Angular service test?

Given this Angular service and its test, what will the test output?

Angular
import { TestBed } from '@angular/core/testing';
import { DataService } from './data.service';

class MockDataService {
  getData() {
    return 'mock data';
  }
}

describe('DataService with DI', () => {
  let service: DataService;

  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [{ provide: DataService, useClass: MockDataService }]
    });
    service = TestBed.inject(DataService);
  });

  it('should return mock data', () => {
    expect(service.getData()).toBe('mock data');
  });
});
AThe test passes but returns undefined because getData is not mocked.
BThe test fails because the real DataService is used instead of the mock.
CThe test passes because the mock service returns 'mock data'.
DThe test throws an error because DataService is not provided.
Attempts:
2 left
💡 Hint

Think about how dependency injection replaces the real service with the mock.

🔧 Debug
intermediate
2:00remaining
Why does this Angular test fail with 'No provider for HttpClient' error?

Consider this test setup for a service that uses HttpClient. Why does it fail?

Angular
import { TestBed } from '@angular/core/testing';
import { HttpClientModule } from '@angular/common/http';
import { ApiService } from './api.service';

describe('ApiService', () => {
  let service: ApiService;

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [HttpClientModule],
      providers: [ApiService]
    });
    service = TestBed.inject(ApiService);
  });

  it('should be created', () => {
    expect(service).toBeTruthy();
  });
});
AHttpClientModule is not imported in the test module, so HttpClient provider is missing.
BApiService is not provided in the test module, causing the error.
CHttpClient is mocked incorrectly causing the error.
DTestBed.inject is used incorrectly; it should be TestBed.get.
Attempts:
2 left
💡 Hint

HttpClient needs a module to provide it in Angular tests.

📝 Syntax
advanced
2:00remaining
Which option correctly injects a mocked service in Angular test?

Choose the correct way to inject a mocked LoggerService in an Angular test.

Angular
class MockLoggerService {
  log(message: string) { return 'mock log: ' + message; }
}

beforeEach(() => {
  TestBed.configureTestingModule({
    // What goes here?
  });
  const logger = TestBed.inject(LoggerService);
});
Aproviders: [{ provide: LoggerService, useClass: MockLoggerService }]
Bproviders: [LoggerService, MockLoggerService]
Cproviders: [{ provide: MockLoggerService, useClass: LoggerService }]
Dproviders: [{ useClass: MockLoggerService }]
Attempts:
2 left
💡 Hint

Remember to provide the original service token and specify the mock class.

state_output
advanced
2:00remaining
What is the value of 'result' after this Angular service test runs?

Given this test with dependency injection, what is the value of result after service.getValue() is called?

Angular
class RealService {
  getValue() { return 42; }
}

class FakeService {
  getValue() { return 100; }
}

let result: number;

beforeEach(() => {
  TestBed.configureTestingModule({
    providers: [{ provide: RealService, useClass: FakeService }]
  });
  const service = TestBed.inject(RealService);
  result = service.getValue();
});
Aundefined
B42
CThrows an error because RealService is not provided
D100
Attempts:
2 left
💡 Hint

Check which class is actually injected for RealService.

🧠 Conceptual
expert
2:00remaining
Which statement best describes Angular's dependency injection in service testing?

Choose the most accurate description of how Angular's dependency injection works in service testing.

AAngular always uses the real service implementation regardless of test configuration.
BAngular replaces the requested service with the provided mock or alternative class during test injection.
CAngular requires manual instantiation of services in tests without using TestBed.
DAngular's dependency injection only works for components, not services.
Attempts:
2 left
💡 Hint

Think about how TestBed providers affect injected services.

Practice

(1/5)
1. What is the main purpose of dependency injection in Angular service testing?
easy
A. To manually create instances of services inside tests
B. To avoid writing tests for services
C. To write services without any dependencies
D. To provide required dependencies automatically to the service under test

Solution

  1. Step 1: Understand dependency injection role

    Dependency injection automatically provides the needed dependencies to services, avoiding manual setup.
  2. Step 2: Relate to testing context

    In tests, this means services get their dependencies without manual creation, simplifying test setup.
  3. Final Answer:

    To provide required dependencies automatically to the service under test -> Option D
  4. Quick Check:

    Dependency injection = automatic dependency provision [OK]
Hint: Dependency injection means automatic supply of needed parts [OK]
Common Mistakes:
  • Thinking dependencies must be created manually in tests
  • Believing services have no dependencies
  • Confusing dependency injection with avoiding tests
2. Which syntax correctly injects a service named MyService in an Angular test using TestBed?
easy
A. const service = TestBed.inject(MyService);
B. const service = new MyService();
C. const service = TestBed.get(MyService);
D. const service = inject(MyService);

Solution

  1. Step 1: Identify correct injection method

    In Angular testing, TestBed.inject() is the modern and correct way to get a service instance.
  2. Step 2: Check other options

    new MyService() bypasses DI, TestBed.get() is deprecated, and inject() is used differently.
  3. Final Answer:

    const service = TestBed.inject(MyService); -> Option A
  4. Quick Check:

    Use TestBed.inject() for service injection [OK]
Hint: Use TestBed.inject() to get services in tests [OK]
Common Mistakes:
  • Using new keyword instead of injection
  • Using deprecated TestBed.get() method
  • Confusing inject() function usage
3. Given this test setup:
TestBed.configureTestingModule({ providers: [MyService] });
const service = TestBed.inject(MyService);
console.log(service.getValue());

If MyService has a method getValue() returning 42, what will be logged?
medium
A. Error: No provider for MyService
B. undefined
C. 42
D. null

Solution

  1. Step 1: Confirm service registration

    MyService is provided in the testing module, so Angular can inject it.
  2. Step 2: Check method output

    The method getValue() returns 42, so calling it logs 42.
  3. Final Answer:

    42 -> Option C
  4. Quick Check:

    Registered service method returns 42 [OK]
Hint: Registered services return their method values correctly [OK]
Common Mistakes:
  • Forgetting to provide the service in TestBed
  • Expecting undefined if method is missing
  • Confusing error messages with missing providers
4. What is the error in this test code snippet?
beforeEach(() => {
  TestBed.configureTestingModule({});
  service = TestBed.inject(MyService);
});

Assuming MyService is not provided anywhere else.
medium
A. Service is injected twice causing conflict
B. No provider for MyService error because it is not registered
C. Syntax error in TestBed configuration
D. No error, code works fine

Solution

  1. Step 1: Check TestBed providers

    The testing module is configured with an empty object, so MyService is not provided.
  2. Step 2: Understand injection failure

    Injecting MyService without providing it causes a runtime error: No provider for MyService.
  3. Final Answer:

    No provider for MyService error because it is not registered -> Option B
  4. Quick Check:

    Missing provider causes injection error [OK]
Hint: Always provide services in TestBed before injecting [OK]
Common Mistakes:
  • Forgetting to add service to providers array
  • Assuming services are auto-provided in tests
  • Ignoring runtime injection errors
5. You want to test OrderService which depends on ApiService. To isolate OrderService tests, which approach is best?
hard
A. Provide a fake ApiService in TestBed to replace the real one
B. Use the real ApiService without changes
C. Do not provide ApiService and expect errors
D. Manually create OrderService without TestBed

Solution

  1. Step 1: Understand dependency isolation

    To test OrderService alone, replace real dependencies with fakes to avoid side effects.
  2. Step 2: Use TestBed with fake provider

    Providing a fake ApiService in TestBed allows controlled, safe testing of OrderService.
  3. Final Answer:

    Provide a fake ApiService in TestBed to replace the real one -> Option A
  4. Quick Check:

    Use fakes to isolate service tests [OK]
Hint: Replace real dependencies with fakes for isolated tests [OK]
Common Mistakes:
  • Using real dependencies causing flaky tests
  • Skipping providers causing injection errors
  • Avoiding TestBed and manual instantiation