Angular Skills Test for Hiring (2026): What to Test and Sample Questions

A practical Angular assessment plan for modern Angular: standalone components, signals, dependency injection, forms and server rendering.

This Angular skills test guide is for hiring managers and recruiters assessing Angular developers. It targets modern Angular, built on standalone components and signals, while still checking the RxJS and dependency injection knowledge that most real apps rely on. You'll find a skills matrix by level, 11 sample questions with what a good answer covers, a formats comparison and a scoring rubric. The questions are different from our Angular interview questions.

What a Angular skills test should measure

AreaJuniorMidSenior
Components and templatesBindings, inputs, outputs, control flowContent projection, queries, pipesComponent API design for shared libraries
Signals and reactivityReads and sets signalscomputed, model() and RxJS interopMoving apps to signals and zoneless change detection
Dependency injectionUses servicesProvider scope and inject()Injector design across lazy routes
Routing and dataBasic routesGuards, lazy loading, route input bindingApp structure and loading strategy
FormsTemplate-driven formsTyped reactive forms, validatorsComplex dynamic forms
Rendering and debuggingReads console errorsChange detection errors, profilingServer rendering, hydration, performance

Tell candidates which Angular version your app runs. Angular ships a major version about every six months, so a developer who has worked on an older NgModule app may know the ideas but not the newest syntax.

Sample Angular test questions

Each question is tagged with a level and format. A first-round test usually needs five to seven.

1. Why aren't input values available in a component's constructor, and where should setup code go?

Junior, concept

What good looks like: Angular runs the constructor before it sets inputs. Decorator-based @Input values are set before ngOnInit, so input-dependent setup goes there. With signal inputs from input(), read them in a computed, an effect or ngOnInit; reading a required signal input before it is set throws an error. Keep constructors for dependency injection.

2. Why is {{ total() }} fine in a template, while {{ calculateTotal(items) }} can be a performance risk?

Junior to mid, reasoning

What good looks like: a method call in a template runs on every change detection pass. Reading a signal just returns its current value, and a computed recalculates only when its dependencies change. A pure pipe is another option, since it reruns only when its input changes.

3. What does model() do?

Mid, concept

What good looks like: it declares a writable signal input that supports two-way binding. The parent binds with [(value)]="query", and when the child calls this.value.set(...), Angular emits a valueChange event that updates the parent. It replaces the older pattern of an @Input plus an @Output named with a Change suffix.

4. What does ExpressionChangedAfterItHasBeenCheckedError mean, and how do you fix it?

Mid, debugging

What good looks like: in development mode, Angular runs an extra check after each change detection pass. The error means a bound value changed during that pass, often because ngAfterViewInit or a child updates parent state, or a getter returns a new value each time, like a new Date. Fix the data flow: compute the value earlier, derive it with computed, or move the update into an event. Wrapping it in setTimeout only hides the problem.

5. Two sibling components inject CartService, but each shows a different cart. Why?

Mid, debugging

What good looks like: the service is probably listed in each component's providers array, so each component gets its own instance. For one shared instance, use @Injectable({ providedIn: "root" }) and remove the component-level providers. A strong candidate adds that a service provided in a lazy route's providers also gets its own instance for that route, which is sometimes what you want.

6. How do you render content a parent passes into a component, and how do you query it?

Mid, concept

What good looks like: use <ng-content> to project it, with a select attribute for named slots. viewChild() queries elements in the component's own template, and contentChild() queries projected content. These query functions return signals, so you can read them in a computed instead of waiting for lifecycle hooks.

7. How do you turn an HttpClient Observable into a signal, and what should you watch for?

Mid, practical

What good looks like: call toSignal(obs$) from @angular/core/rxjs-interop. It subscribes right away and unsubscribes when its context is destroyed. It must run in an injection context, such as a field initializer or the constructor, or receive an injector. Until the first value arrives the signal is undefined unless you pass initialValue. An error from the Observable is thrown when the signal is read.

8. How can a routed component read route parameters without subscribing to ActivatedRoute?

Mid, practical

What good looks like: add withComponentInputBinding() to provideRouter. Route parameters, query parameters and resolver data then bind to component inputs with matching names, including signal inputs. For components used outside the router, injecting ActivatedRoute may still be clearer.

9. Add a "confirm password" check to a reactive form.

Mid, practical

What good looks like: write a cross-field validator and attach it to the FormGroup, not to a single control. It compares the two values and returns an error object such as { passwordMismatch: true }, or null. Typed forms infer value types, and nonNullable: true (or NonNullableFormBuilder) makes reset return the initial value instead of null. Show the error after the field is touched.

10. A component reads localStorage. It works in the browser but crashes when the app is server-rendered. Fix it.

Senior, debugging

What good looks like: the server has no window, document or localStorage. Run browser-only code in afterNextRender, or check isPlatformBrowser(inject(PLATFORM_ID)) first. Better still, wrap storage in a small injectable service so components never touch browser globals, and keep the first render the same on server and client to avoid hydration mismatches.

11. What has to change to run an Angular app without Zone.js?

Senior, concept

What good looks like: without Zone.js, Angular no longer learns about changes by patching browser async APIs. A view refreshes when a signal it reads changes, after template event handlers, when inputs are set, through the async pipe, or after markForCheck(). Code that changes plain fields inside setTimeout or a third-party callback won't update the screen. Migration means moving state to signals, making components work with OnPush, then switching to the zoneless provider and removing zone.js.

Test formats compared

FormatWhat it showsWeaknessBest for
Multiple choice quizFamiliarity with Angular APIs and decoratorsAPIs change between versions; easy to look upShort junior filters, if kept current
Take-home projectFeature structure, services, forms and testsSetup takes time; authorship is hard to confirmMid roles, using a starter project
Live codingReasoning about change detection and data flowPressure and setup frictionSenior frontend roles
Work sampleA real fix, such as a provider scope bug or a slow tableNeeds a maintained sample appTeams with a large Angular codebase
Adaptive AI interviewDepth on signals, DI and RxJS, with follow-upsNo full feature build; check topic coverageScreening every applicant the same way

Angular changes fast, so review your question bank every major release. A technical screen built on concepts (provider scope, data flow, rendering) stays useful longer than one built on syntax.

Scoring rubric

ScoreWhat you see
1Can't explain how data reaches the template or why a view isn't updating.
2Knows the syntax but treats errors as noise, for example reaching for setTimeout.
3Correct answers in modern Angular. Understands provider scope, signals and forms.
4Reasons about rendering, server rendering and migration trade-offs, and explains them clearly.

Running a Angular test with NTRVSTA

Angular is in NTRVSTA's exam library, alongside React and Node.js. The live AI interviewer adapts difficulty to each answer, so a candidate who explains provider scope well moves on to server rendering or zoneless questions, while one who struggles gets a simpler question or a hint. Its follow-ups ask why a fix works, which shows whether someone understands change detection or is reciting a workaround. For senior roles, add a system-design question on the interactive whiteboard.

Each interview ends with a score breakdown (technical skills, English proficiency, communication), video snippets and a shareable report your frontend leads can skim. Pair it with our Angular interview questions for later rounds, compare tools in the best coding assessment tools, and see the React skills test if you hire for both frameworks.

Questions

How long should an Angular skills test take?

About 45 minutes for a first round. Angular answers often involve several concepts at once, such as DI, signals and change detection, so allow time for follow-up questions.

Which Angular version should the test target?

The version your app runs, using standalone components and signals if your app does. Treat brand-new APIs as a bonus, and avoid marking down candidates who know the ideas from an older version.

Can a React developer pass an Angular assessment?

They will do well on the general frontend topics, but dependency injection, RxJS and Angular templates are specific to Angular. If you are open to cross-framework hires, score those rows separately and weigh core frontend skill more.

Ready to try an adaptive Angular screen? Book a 20-minute demo, or take a sample interview yourself.

NTRVSTA
‍