Bird
Raised Fist0
Expressframework~20 mins

Middleware testing strategies in Express - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Middleware 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 Express middleware test?
Consider this Express middleware that adds a custom header. What will the test output when the middleware is called?
Express
const express = require('express');
const request = require('supertest');

const app = express();

function customHeader(req, res, next) {
  res.set('X-Custom-Header', 'TestValue');
  next();
}

app.use(customHeader);
app.get('/', (req, res) => res.send('Hello'));

request(app)
  .get('/')
  .end((err, res) => {
    if (err) throw err;
    console.log(res.headers['x-custom-header']);
  });
Aundefined
BError: next() not called
CTestValue
Dnull
Attempts:
2 left
💡 Hint
Think about what the middleware does before calling next() and how headers are set.
❓ state_output
intermediate
2:00remaining
What is the value of req.processed after this middleware chain?
Given these two middlewares, what will be the value of req.processed in the final handler?
Express
const express = require('express');
const app = express();

function firstMiddleware(req, res, next) {
  req.processed = 1;
  next();
}

function secondMiddleware(req, res, next) {
  req.processed += 2;
  next();
}

app.use(firstMiddleware);
app.use(secondMiddleware);

app.get('/', (req, res) => {
  res.send(String(req.processed));
});
A1
B2
Cundefined
D3
Attempts:
2 left
💡 Hint
Remember that middlewares run in order and can modify the request object.
🔧 Debug
advanced
2:00remaining
Why does this middleware test fail with a timeout?
This test for an Express middleware hangs and eventually times out. What is the cause?
Express
function faultyMiddleware(req, res, next) {
  // Missing next call
}

const express = require('express');
const request = require('supertest');
const app = express();
app.use(faultyMiddleware);

request(app)
  .get('/')
  .expect(200)
  .end((err, res) => {
    if (err) throw err;
  });
Ares.send is called twice causing an error
BMiddleware does not call next(), causing the test to hang
CMissing error handling middleware causes failure
DRequest URL is incorrect causing no response
Attempts:
2 left
💡 Hint
Think about what happens if next() is not called.
📝 Syntax
advanced
2:00remaining
Which option correctly tests async middleware with error handling?
Given an async middleware that may throw an error, which test code correctly handles the error?
Express
async function asyncMiddleware(req, res, next) {
  try {
    await someAsyncOperation();
    next();
  } catch (err) {
    next(err);
  }
}
Arequest(app).get('/').expect(500).end((err) => { if (err) done(err); else done(); });
Brequest(app).get('/').then(() => done()).catch(done);
Crequest(app).get('/').expect(500).end(done);
Drequest(app).get('/').expect(200).end((err) => { if (err) done(err); else done(); });
Attempts:
2 left
💡 Hint
Consider how to handle errors in async middleware tests with supertest.
🧠 Conceptual
expert
3:00remaining
Which testing strategy best isolates middleware behavior?
When testing Express middleware, which approach best isolates the middleware's behavior from the rest of the app?
ATest middleware only by calling it with mock req, res, and next objects
BMount middleware on a minimal Express app and test requests against it
CTest middleware by running the full app and checking final responses
DUse integration tests that cover multiple routes and middleware chains
Attempts:
2 left
💡 Hint
Think about how to test middleware without interference from other parts.

Practice

(1/5)
1. What is the main purpose of testing middleware in an Express app?
easy
A. To verify that middleware correctly processes requests and responses
B. To check the database connection speed
C. To test the frontend user interface
D. To measure server hardware performance

Solution

  1. Step 1: Understand middleware role

    Middleware functions handle requests and responses in Express apps.
  2. Step 2: Identify testing focus

    Testing middleware ensures it processes requests and responses correctly.
  3. Final Answer:

    To verify that middleware correctly processes requests and responses -> Option A
  4. Quick Check:

    Middleware testing = request/response handling [OK]
Hint: Middleware tests check request and response flow [OK]
Common Mistakes:
  • Confusing middleware testing with UI testing
  • Testing unrelated server hardware
  • Ignoring request and response handling
2. Which syntax correctly uses a testing library to simulate a request to Express middleware?
easy
A. request(app).get('/path').expect(200, done)
B. app.request('/path').send(200)
C. middleware.test('/path').status(200)
D. express.test(app).get('/path').check(200)

Solution

  1. Step 1: Recognize common testing syntax

    Using 'request(app).get(path).expect(status, done)' is standard with supertest library.
  2. Step 2: Compare options

    Only request(app).get('/path').expect(200, done) matches valid syntax for simulating requests in Express tests.
  3. Final Answer:

    request(app).get('/path').expect(200, done) -> Option A
  4. Quick Check:

    Simulate request = request(app).get() [OK]
Hint: Use request(app).get() to simulate Express requests [OK]
Common Mistakes:
  • Using non-existent methods like app.request()
  • Confusing middleware with app methods
  • Incorrect chaining of test methods
3. Given this middleware test snippet, what will be the output if the middleware calls next() without error?
app.use((req, res, next) => {
  if (req.query.fail) return next(new Error('Fail'));
  res.status(200).send('Success');
});

request(app).get('/?fail=true').expect(500, done);
medium
A. The test passes with status 200
B. The test fails because status 200 is sent
C. The test throws a syntax error
D. The test passes because error triggers 500 status

Solution

  1. Step 1: Analyze middleware behavior on fail query

    If req.query.fail is true, middleware calls next() with an error, triggering Express error handling.
  2. Step 2: Understand test expectation

    The test expects status 500, which matches Express default error response status.
  3. Final Answer:

    The test passes because error triggers 500 status -> Option D
  4. Quick Check:

    Error passed to next() = 500 response [OK]
Hint: Error in next() triggers 500 status by default [OK]
Common Mistakes:
  • Assuming next() without error sends 200
  • Ignoring error passed to next()
  • Confusing status codes for errors
4. You wrote this test but it always times out. What is the likely error?
app.use((req, res, next) => {
  if (!req.headers.auth) return res.status(401);
  next();
});

request(app).get('/').expect(401, done);
medium
A. next() is called twice causing conflict
B. Missing res.send() causes response never to finish
C. Incorrect HTTP method used in request
D. Middleware does not check headers properly

Solution

  1. Step 1: Check middleware response on missing auth

    res.status(401) sets status but does not end response without res.send() or res.end().
  2. Step 2: Understand test timeout cause

    Without ending response, test waits indefinitely causing timeout.
  3. Final Answer:

    Missing res.send() causes response never to finish -> Option B
  4. Quick Check:

    res.status() alone doesn't end response [OK]
Hint: Always end response with res.send() or res.end() [OK]
Common Mistakes:
  • Assuming res.status() ends response
  • Calling next() after sending response
  • Using wrong HTTP method in test
5. You want to test middleware that conditionally modifies the request object and passes control. Which approach best ensures both modification and flow are tested?
hard
A. Test middleware by calling it without any request data
B. Only check the final response status code
C. Use a mock request object and spy on next() to confirm it was called
D. Skip testing and rely on manual checks

Solution

  1. Step 1: Understand middleware modifies request and calls next()

    Testing must confirm request changes and that next() is called to continue flow.
  2. Step 2: Choose testing approach

    Using a mock request and spying on next() lets you verify both modification and flow control.
  3. Final Answer:

    Use a mock request object and spy on next() to confirm it was called -> Option C
  4. Quick Check:

    Mock request + spy next() = full middleware test [OK]
Hint: Spy next() and check request changes for full test [OK]
Common Mistakes:
  • Ignoring next() call verification
  • Testing only response status
  • Not providing request data in tests
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