Bird
Raised Fist0
Angularframework~5 mins

Component testing basics in Angular - Cheat Sheet & Quick Revision

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
Recall & Review
beginner
What is the main goal of component testing in Angular?
To check if an Angular component works correctly by testing its template, class logic, and interaction with inputs and outputs.
Click to reveal answer
beginner
Which Angular testing utility is commonly used to create a test environment for a component?
TestBed is used to configure and create a testing module that mimics an Angular module for the component under test.
Click to reveal answer
intermediate
Why do we use fixture.detectChanges() in Angular component tests?
It triggers Angular's change detection to update the component's template with the latest data and state before assertions.
Click to reveal answer
intermediate
How can you test an @Input property in an Angular component test?
Set the input property directly on the component instance in the test, then call fixture.detectChanges() to update the view.
Click to reveal answer
intermediate
What is the purpose of mocking services in Angular component tests?
To isolate the component by replacing real services with fake ones, so tests focus only on the component's behavior without external dependencies.
Click to reveal answer
Which Angular testing tool helps create a test module for a component?
AHttpClient
BRouter
CNgModule
DTestBed
What does fixture.detectChanges() do in a component test?
ACreates a new component instance
BRuns change detection to update the template
CMocks a service
DClears the test environment
How do you test an @Output event in Angular component testing?
ASubscribe to the event emitter and trigger the event
BSet the @Output property directly
CCall <code>fixture.detectChanges()</code> only
DMock the component
Why mock services in component tests?
ATo isolate the component and avoid real dependencies
BTo speed up the Angular compiler
CTo test the service itself
DTo change component styles
Which lifecycle hook is usually called automatically during fixture.detectChanges()?
AngAfterViewChecked
BngOnDestroy
CngOnInit
DngDoCheck
Explain the steps to set up and run a basic Angular component test.
Think about how you prepare the component and check its output.
You got /5 concepts.
    Describe how to test an Angular component's input and output properties.
    Focus on how data flows in and out of the component.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the main purpose of component testing in Angular?
      easy
      A. To test the entire application at once
      B. To check if a component works correctly by itself
      C. To test only the services used by components
      D. To check the database connection

      Solution

      1. Step 1: Understand component testing scope

        Component testing focuses on testing a single component in isolation, not the whole app or services alone.
      2. Step 2: Compare options with definition

        Only To check if a component works correctly by itself describes testing a component by itself, which matches the purpose of component testing.
      3. Final Answer:

        To check if a component works correctly by itself -> Option B
      4. Quick Check:

        Component testing = isolated component check [OK]
      Hint: Component testing means testing one piece alone [OK]
      Common Mistakes:
      • Confusing component testing with full app testing
      • Thinking services are tested alone in component tests
      • Assuming database is tested in component tests
      2. Which Angular testing utility is used to configure and create a component for testing?
      easy
      A. TestBed
      B. HttpClient
      C. NgModule
      D. RouterModule

      Solution

      1. Step 1: Identify Angular testing utilities

        TestBed is the Angular utility designed to configure and create components in tests.
      2. Step 2: Eliminate unrelated options

        HttpClient is for HTTP requests, NgModule defines modules, RouterModule handles routing, none create test components.
      3. Final Answer:

        TestBed -> Option A
      4. Quick Check:

        TestBed sets up test components [OK]
      Hint: TestBed is the test setup tool in Angular [OK]
      Common Mistakes:
      • Confusing TestBed with NgModule
      • Choosing HttpClient which is unrelated to testing setup
      • Selecting RouterModule which is for routing
      3. Given this test snippet, what will fixture.nativeElement.textContent contain?
      TestBed.configureTestingModule({ declarations: [HelloComponent] }).compileComponents();
      const fixture = TestBed.createComponent(HelloComponent);
      fixture.componentInstance.name = 'Alice';
      fixture.detectChanges();
      
      @Component({ selector: 'app-hello', template: '<p>Hello, {{name}}!</p>' }) class HelloComponent { name = ''; }
      medium
      A. Hello, Alice!
      B. Hello, !
      C. Hello, name!
      D. Error: name not defined

      Solution

      1. Step 1: Understand component property binding

        The component's name property is set to 'Alice' before change detection.
      2. Step 2: Effect of fixture.detectChanges()

        This updates the template to reflect the new name value, so the paragraph shows 'Hello, Alice!'.
      3. Final Answer:

        Hello, Alice! -> Option A
      4. Quick Check:

        Property set + detectChanges updates template [OK]
      Hint: detectChanges updates template with latest property values [OK]
      Common Mistakes:
      • Forgetting to call detectChanges so template stays old
      • Assuming template shows variable name literally
      • Thinking missing name causes error
      4. What is wrong with this test setup code?
      beforeEach(() => {
        TestBed.configureTestingModule({
          declarations: [MyComponent]
        });
        fixture = TestBed.createComponent(MyComponent);
        component = fixture.componentInstance;
      });
      medium
      A. fixture and component should be declared inside beforeEach
      B. Should import MyComponent instead of declaring it
      C. Missing call to compileComponents() before createComponent()
      D. No need to call createComponent() in beforeEach

      Solution

      1. Step 1: Check TestBed setup sequence

        When using TestBed with components, compileComponents() must be called to compile templates before creating the component.
      2. Step 2: Identify missing step

        The code configures the module but skips compileComponents(), which can cause errors or incomplete setup.
      3. Final Answer:

        Missing call to compileComponents() before createComponent() -> Option C
      4. Quick Check:

        compileComponents() needed before createComponent() [OK]
      Hint: Always call compileComponents() before createComponent() [OK]
      Common Mistakes:
      • Skipping compileComponents() causes template errors
      • Declaring variables inside beforeEach unnecessarily
      • Thinking createComponent() is optional
      5. You want to test a component that shows a list of items passed as an input. Which approach correctly tests that the rendered list matches the input array?
      @Component({ template: '<ul><li *ngFor="let item of items">{{item}}</li></ul>' })
      class ListComponent { @Input() items: string[] = []; }
      hard
      A. Only check component.items property without inspecting the DOM
      B. Set component.items but do not call detectChanges(), then check fixture.nativeElement.textContent
      C. Call detectChanges() before setting component.items, then check component.items.length
      D. Set component.items to an array, call detectChanges(), then check fixture.nativeElement.querySelectorAll('li').length

      Solution

      1. Step 1: Set input and update template

        Assign the input array to component.items and call detectChanges() to update the rendered list.
      2. Step 2: Verify rendered list length

        Check the number of <li> elements in the DOM matches the input array length using querySelectorAll('li').length.
      3. Final Answer:

        Set component.items, call detectChanges(), then check li elements count -> Option D
      4. Quick Check:

        Input set + detectChanges + DOM check = correct test [OK]
      Hint: Always call detectChanges() after input changes before checking DOM [OK]
      Common Mistakes:
      • Not calling detectChanges() after input change
      • Checking component property only without DOM verification
      • Calling detectChanges() before setting inputs