Nock ist eine Bibliothek, für das Mocken eines HTTP-Servers und das Prüfen von Erwartungen mithilfe von Node.js. Nock kann dazu verwendet werden, um Module isoliert zu testen, welche HTTP-Abfragen versenden müssen.

Erste Schritte

Nock steht als NPM-Paket zu Verfügung, welches als Dev-Dependency installiert werden kann:

npm install --save-dev nock

Nachdem Nock installiert wurde kann es in einem Test-File importiert und verwendet werden, hier ein kurzes beispiel mit Jest:


import * as nock from 'nock';

describe('Service', () => {
  it('should intercept the request', async () => {
    nock('https://example.com')
      .get('/api')
      .reply(200, { data: 'mocked data' });

    const response = await fetch('https://example.com/api');

    expect(response.status).toBe(200);
    expect(await response.json()).toEqual({ data: 'mocked data' });
  });
});

Erfassungsbereich

Nock bietet unterschiedliche Möglichkeiten um einzuschränken, welche Abfragen abgefangen und durch Nock bearbeitet werden sollen. Dabei können Einschränkungen auf Grund von hostname, path und query angegeben werden.

Hier ist es wichtig zu beachten, das Nock standardmässig ein Interceptor wieder entfernt, nachdem dieser das erste mal verwendet wurde. So können mehrere Abfragen an den gleichen Endpunkt unterschiedlich behandelt werden, soll dies nicht der fall sein, kann mit times in der Methodenkette angegeben werden wie oft dieser Interceptor aufgerufen werden soll oder mit persist angegeben das er immer aufgerufen werden soll.

Hostname

Als hostname kann entweder die URL angegeben werden oder ein regulärer Ausdruck:

URL:


import * as nock from 'nock';

nock('https://example.com')
  .get('/resource')
  .reply(200, 'Hello, world!');

Regulärer Ausdruck:


import * as nock from 'nock';

nock(/example/)
  .get('/resource')
  .reply(200, 'Hello, world!');

Path

Der Pfad kann als String, regulärer Ausdruck oder als Funktion angegeben werden:

String:


nock('https://example.com')
  .get('/resource')
  .reply(200, 'String match');

String:


nock('https://example.com')
  .get(/source$/)
  .reply(200, 'Regex match');

Funktion:


nock('https://example.com')
  .get((uri) => uri.includes('cats'))
  .reply(200, 'Function match');

Antwortspezifikation

Antworten auf eine Abfrage können mit der reply Methode spezifiziert werden, diese nimmt als Parameter den Statuscode und den Antwortkörper, sowie optional die Header entgegen:


nock('https://example.com')
  .get('/v1/resource')
  .reply(200, 'String Antwort');

nock('https://example.com')
  .get('/v2/resource')
  .reply(200, {
    name: 'Micky Mouse',
    alter: 96
  });

Falls eine grössere Antwort spezifiziert werden soll, kann auch mit dem Inhalt einer externen Datei geantwortet werden, dazu kann die replyWithFile Methode verwendet werden:


nock('https://example.com')
  .get('/v1/resource')
  .replyWithFile(200, __dirname + '/response.json');

Last updated 20 März 2025, 17:01 +0100 . history