jest-mock-req-res v1.0.2
jest-mock-req-res
Jest mocks for Express Request
and Response
objects. Inspired by mock-req-res.
Motivation
The mocks provided by mock-req-res
are very useful due to their simplicity of use, but they depend on sinon
, whereas I've been working in teams that use jest
as their weapon of choice for testing. That's why I decided to replace the Sinon stubs with Jest spies. In addition, this package is written in Typescript and typings are provided.
Much like the original mock-req-res
package, the intention of these mocks is to allow you to write properly isolated tests for your Express middleware functions.
Mocks are designed based on the specs for Express version 4.x. These mocks should be compatible with version 5.x, as far as I can tell, except that the host
property is not present in the Request
interface for version 4. You can add it as a custom property when mocking requests (see below).
Dependencies
The only dependency (marked as a peer dependency) is jest
version 13.0.0 or newer, as the syntax for creating mocks is different in earlier versions.
Installation
Simply add this package as a development dependency to your project:
npm i -D jest-mock-req-res
API
mockRequest(options)
The mockRequest()
function creates a mock Request
object. The options
parameter is an optional object with any keys you want to override or add to the created object. For instance:
const req1 = mockRequest({ awesome: 'value' });
console.log(req1.awesome);
// => 'value'
const req2 = mockRequest({ hostname: 'example.com' });
console.log(req2.hostname);
// => 'example.com'
The default mock contains the following members:
app: {},
baseUrl: '',
body: {},
cookies: {},
fresh: true,
hostname: '',
ip: '127.0.0.1',
ips: [],
method: '',
originalUrl: '',
params: {},
path: '',
protocol: 'https',
query: {},
route: {},
secure: true,
signedCookies: {},
stale: false,
subdomains: [],
xhr: true,
accepts: jest.fn(),
acceptsCharsets: jest.fn(),
acceptsEncodings: jest.fn(),
acceptsLanguages: jest.fn(),
get: jest.fn(), // (*)
header: jest.fn(), // (*)
is: jest.fn(),
range: jest.fn(),
(*) The header()
method is an alias for the get()
method, as provided in Express.
Note that this invariant is not enforced, so if you override either of the header()
or get()
methods, this alias will not work as expected.
mockResponse()
The mockResponse()
function creates a mock Response
object. The options
parameter is an optional object with any keys you want to override or add to the created object. For instance:
const res1 = mockResponse({ awesome: 'value' });
console.log(res1.awesome);
// => 'value'
const res2 = mockResponse({ locals: { name: 'John Smith' } });
console.log(res2.locals.name);
// => 'John Smith'
The default mock contains the following members:
app: {},
headersSent: false,
locals: {},
append: jest.fn().mockReturnThis(),
attachment: jest.fn().mockReturnThis(),
clearCookie: jest.fn().mockReturnThis(),
contentType: jest.fn().mockReturnThis(), // (*)
cookie: jest.fn().mockReturnThis(),
download: jest.fn(),
end: jest.fn(),
format: jest.fn().mockReturnThis(),
get: jest.fn(),
header: jest.fn().mockReturnThis(), // (**)
json: jest.fn().mockReturnThis(),
jsonp: jest.fn().mockReturnThis(),
links: jest.fn().mockReturnThis(),
location: jest.fn().mockReturnThis(),
redirect: jest.fn(),
render: jest.fn(),
send: jest.fn().mockReturnThis(),
sendFile: jest.fn(),
sendStatus: jest.fn().mockReturnThis(),
set: jest.fn().mockReturnThis(), // (**)
status: jest.fn().mockReturnThis(),
type: jest.fn().mockReturnThis(), // (*)
vary: jest.fn().mockReturnThis(),
(*) The contentType()
method behaves as an alias to the type()
method, as that is the actual Express behavior, though it's not mentioned in the API docs.
(**) The header()
method is an alias for the set()
method, as provided in Express.
Note that these two invariants are not enforced, so if you override any of the contentType()
, header()
, set()
or type()
methods, the aliases will not work as expected.