So far every lesson has checked with a look at the browser. That does not last long: a change breaks the error case that nobody clicks on anymore. This lesson writes the tests that protect the contact list (loading, error, filter) and the error interceptor, and runs them with ng test. You work in web/kladde-angular. K2 2.7 explained testing in general; here it is about Angular.

State of the checks. All tests of this lesson ran in a throwaway project (Angular 22.2, Node 24.22.3, Vitest 5.1.0 with jsdom): ng test --no-watch exit code 0 with 4 files and 8 tests (3 for the list, 3 for the interceptor, 1 for the card, 1 of the root component). Also run, and named here with their result: the test without a trigger for the request (hung), the error case against the first version of the list (red), a filter with startsWith instead of includes (exit code 1) and a run without matching files (exit code 1). List and interceptor are minimal versions (names as in 0202); if your state differs, adapt the tests. Not executed: component harnesses (the package @angular/cdk was not installed in the project), Karma, a run with a browser instead of jsdom, --coverage. Statements about Angular come from angular.dev (pages on testing, HTTP testing, component harnesses, read on the day of writing).

What ng test does

New projects come with Vitest with jsdom; according to the page "Testing", Karma is still possible, and there is a migration guide for existing projects. ng test builds the application in watch mode and starts the runner: saving a file restarts the tests. If the environment sets CI=true (most build servers do), ng test runs once and returns; otherwise you pass --no-watch --no-progress. For you that means: locally npx ng test, in the script and in the pipeline npx ng test --no-watch.

What counts then is the exit code, not the message (lesson 0302 of the WinUI course says the same about dotnet test):

PowerShell
npx ng test --no-watch *> test.txt
"exit=$LASTEXITCODE"

An empty run is not a green run: if a pattern with --include matches no file, ng test reports "No tests found matching the following patterns" and ends with exit code 1. That is intended; a pipeline that stays green with zero tests has no value as evidence. The tests sit next to the code in *.spec.ts, and the types for describe, it and expect come from vitest/globals (tsconfig.spec.json).