Bird
Raised Fist0
NestJSframework~5 mins

Unit testing controllers in NestJS - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is the main purpose of unit testing controllers in NestJS?
To verify that the controller methods handle requests correctly and interact properly with services, without involving external dependencies.
Click to reveal answer
beginner
Which NestJS testing utility helps create a testing module for controllers?
The Test.createTestingModule() method is used to build a testing module that can include controllers and mocked providers.
Click to reveal answer
intermediate
Why do we mock services when unit testing controllers?
Mocking services isolates the controller logic by replacing real service calls with fake ones, ensuring tests focus only on controller behavior.
Click to reveal answer
intermediate
How do you test a controller method that returns a promise in NestJS?
Use async/await in the test function to wait for the promise to resolve, then assert the returned value or behavior.
Click to reveal answer
intermediate
What is a common pattern to verify that a controller calls a service method correctly?
Use Jest spies or mocks to check if the service method was called with expected arguments when the controller method runs.
Click to reveal answer
What does Test.createTestingModule() do in NestJS unit tests?
ACreates a module for testing with controllers and providers
BRuns the entire application
CMocks HTTP requests automatically
DGenerates database schemas
Why should services be mocked when unit testing controllers?
ATo speed up database queries
BTo test the service logic instead
CTo isolate controller logic and avoid external dependencies
DTo automatically generate test data
Which Jest feature helps verify if a service method was called by a controller?
Ajest.resetModules()
Bjest.mock()
Cjest.clearAllMocks()
Djest.spyOn()
How do you handle asynchronous controller methods in tests?
AIgnore the promise and test synchronously
BUse async/await to wait for the promise
CUse setTimeout to delay assertions
DConvert promises to callbacks
What is the best practice for testing controller methods that depend on services?
AMock the services to isolate controller logic
BUse real services with a test database
CSkip testing those methods
DTest only the services, not the controllers
Explain how to set up a unit test for a NestJS controller method that calls a service.
Think about isolating the controller by mocking dependencies.
You got /5 concepts.
    Describe why mocking is important in unit testing NestJS controllers and how it improves test quality.
    Consider what happens if you don’t mock services in unit tests.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the main purpose of unit testing a controller in NestJS?
      easy
      A. To verify the controller handles requests correctly without depending on other parts
      B. To test the database connection and queries
      C. To check the UI rendering of the application
      D. To measure the performance of the entire application

      Solution

      1. Step 1: Understand the role of a controller

        Controllers handle incoming requests and return responses, so testing them focuses on this behavior.
      2. Step 2: Identify what unit testing isolates

        Unit testing isolates the controller from other parts like services or databases to test its logic alone.
      3. Final Answer:

        To verify the controller handles requests correctly without depending on other parts -> Option A
      4. Quick Check:

        Unit testing controller logic = To verify the controller handles requests correctly without depending on other parts [OK]
      Hint: Controllers handle requests; test them isolated from services [OK]
      Common Mistakes:
      • Confusing unit tests with integration tests
      • Testing database or UI in controller unit tests
      • Ignoring mocking dependencies
      2. Which of the following is the correct way to create a testing module for a controller in NestJS?
      easy
      A. const module = Test.createModule({ providers: [MyController] });
      B. const module = new Module({ controllers: [MyController] });
      C. const module = await Test.createTestingModule({ controllers: [MyController] }).compile();
      D. const module = await Test.createTestingModule({ services: [MyController] }).compile();

      Solution

      1. Step 1: Recall NestJS testing syntax

        Use Test.createTestingModule with a config object specifying controllers or providers, then compile it.
      2. Step 2: Identify correct property for controllers

        The property to register controllers is 'controllers', not 'services' or 'providers' for controllers.
      3. Final Answer:

        const module = await Test.createTestingModule({ controllers: [MyController] }).compile(); -> Option C
      4. Quick Check:

        Use controllers array in createTestingModule = const module = await Test.createTestingModule({ controllers: [MyController] }).compile(); [OK]
      Hint: Use controllers: [] inside Test.createTestingModule [OK]
      Common Mistakes:
      • Using 'services' instead of 'controllers' key
      • Forgetting to await compile()
      • Using new Module() instead of Test.createTestingModule
      3. Given this controller method and test snippet, what will result be?
      class MyController {
        getHello() {
          return 'Hello World!';
        }
      }
      
      // Test snippet
      const controller = new MyController();
      const result = controller.getHello();
      medium
      A. null
      B. undefined
      C. An error because getHello is async
      D. 'Hello World!'

      Solution

      1. Step 1: Analyze the controller method

        The method getHello returns the string 'Hello World!' synchronously.
      2. Step 2: Check the test call

        Calling getHello() directly returns the string without errors or async behavior.
      3. Final Answer:

        'Hello World!' -> Option D
      4. Quick Check:

        Direct method call returns string = 'Hello World!' [OK]
      Hint: Direct call returns method's return value immediately [OK]
      Common Mistakes:
      • Assuming async behavior without async keyword
      • Expecting undefined if not mocked
      • Confusing method call with property access
      4. What is wrong with this unit test for a NestJS controller?
      describe('MyController', () => {
        let controller: MyController;
      
        beforeEach(() => {
          controller = new MyController();
        });
      
        it('should return greeting', () => {
          expect(controller.getHello()).toBe('Hello World!');
        });
      });
      medium
      A. The controller is not created using Test.createTestingModule
      B. The test does not mock the service dependency
      C. The test is missing async keyword
      D. The expect statement uses toBe instead of toEqual

      Solution

      1. Step 1: Check controller instantiation

        Creating controller directly is allowed but only if it has no dependencies.
      2. Step 2: Identify missing mocking

        If the controller depends on a service, it must be mocked to isolate controller logic.
      3. Final Answer:

        The test does not mock the service dependency -> Option B
      4. Quick Check:

        Missing mocks for dependencies = The test does not mock the service dependency [OK]
      Hint: Always mock services when testing controllers with dependencies [OK]
      Common Mistakes:
      • Assuming direct instantiation is always wrong
      • Forgetting to mock injected services
      • Confusing toBe and toEqual for strings
      5. You want to unit test a NestJS controller method that calls a service method returning a promise. Which approach correctly mocks the service to test the controller method synchronously?
      hard
      A. Mock the service method with jest.fn().mockResolvedValue(value) and await the controller method in the test
      B. Mock the service method with jest.fn().mockReturnValue(value) without async/await
      C. Call the real service method without mocking to test actual behavior
      D. Mock the service method with jest.fn().mockImplementation(() => { throw new Error(); })

      Solution

      1. Step 1: Understand async service method

        The service method returns a promise, so the mock must simulate a resolved promise.
      2. Step 2: Use jest.fn().mockResolvedValue

        This creates a mock that returns a resolved promise with the given value, allowing the controller method to await it.
      3. Step 3: Await controller method in test

        The test must await the controller method to handle the async call properly.
      4. Final Answer:

        Mock the service method with jest.fn().mockResolvedValue(value) and await the controller method in the test -> Option A
      5. Quick Check:

        Use mockResolvedValue and await async calls = Mock the service method with jest.fn().mockResolvedValue(value) and await the controller method in the test [OK]
      Hint: Use mockResolvedValue for async mocks and await calls [OK]
      Common Mistakes:
      • Using mockReturnValue for async methods
      • Not awaiting async controller methods
      • Testing real service instead of mocking
      Recommended

      Ready to prove it?

      Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard