Automatiserade tester

Setup

Testning kommer att göras med npm. För det behöver vi installera några paket. De är alla dev dependencies.

npm install mocha chai supertest --save-dev

Efter installationen är vi redo att köra igång. Test kommer att ligga i en mapp som ska heta test i projektets root.

mkdir test

För att köra test så används npm och ett script kommando från package.json. Notera att -r parametern enbart krävs om dotenv används.

package.json
"scripts": {
    ...
    "test": "mocha -r dotenv/config --timeout 10000 --exit"

Ett test med GET

Den här stilen av test kallas för Behaviour Driven Development(BDD), alltså beteende driven utveckling. Med detta menas att vi beskriver något som koden ska utföra och vad vi förväntar oss ska ske då.

I detta första test så ska vi testa en node servers index route, vi förväntar oss att den svarar med HTTP status 200, alltså ok. Om servern gör detta så vet vi att den är igång och fungerar.

test/indextest.js
// ladda in dependencies
const expect = require('chai').expect;
const app = require('../app');
const request = require('supertest')(app);

// testet börjar här
describe('index route', () => {
  describe('GET /', () => {
    // vad förväntar vi oss ska ske, it should return...
    it('should return OK status', () => {
      // utför requesten, kontrollera att den svarar 200 och avsluta sedan testet
      request.get('/')
        .expect(200)
        .end((err, res) => {
          if (err) throw err;
        });
    });
  });
});

Testet kontrollerar aldrig vad sidan faktiskt svarar oss, utan enbart att status koden är 200. För att faktiskt se vad som returneras så behöver vi använda andra metoder för att kontrollera svaret.

Vi utökar testet för att se att index sidan välkomnar användaren.

views/index.pug
extends layout

block content
  h1 Welcome user

POST test

Att kunna skicka data med tester är väldigt användbart, då det tar bort ett stort manuellt moment med att hela tiden behöva mata in data i ett formulär till exempel.

test/logintest.js
describe('/login', () => {
  ...
  describe('POST /', () => {
    it('should sign in user given a correct request body', (done) => {
      // routen vi postar till är /login
      // vi skickar data med form typen
      // form fälten är username och password
      // routen som sköter login redirectar användaren
      // till routen /home vid lyckad login, detta ger http status 302
      request.post('/login')
        .type('form')
        .send({
          username: 'USERNAME',
          password: 'PASSWORD'
        })
        .expect(302)
        .expect('Location', '/home')
        .end((err, res) => {
          if (err) throw err;
          return done();
        });
    });
});

Last updated