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