2017-01-17 2 views
0

Ich versuche ein Testmuster für eine neue Hapi App zu erstellen. Ich habe Mocha und Chai in der Vergangenheit mit Express benutzt, aber ich versuche mit Lab und Code im Hapi-Ökosystem zu bleiben. Ich verwende auch Bookshelf und Knex zur Datenbankinteraktion.Wie benutzt man Sinon um Knex Anrufe im Hapi/Lab Test auszutragen?

Also habe ich einen einfachen Gesundheits-Endpunkt, den ich testen möchte.

Im Handler wird nur eine schnelle Abfrage durchgeführt, um sicherzustellen, dass eine Verbindung zur Datenbank hergestellt werden kann.

'use strict'; 

const bookshelf = require('../config/db'); 
const knex = bookshelf.knex; 

module.exports = { 
    health: function (request, reply) { 
    knex.raw('SELECT version()').then(() => { 
     reply('service is running'); 
    }).catch((err) => { 
     reply({err: err, code: 500}); 
    }); 
    } 
}; 

Soweit ich es verstehe, den Server erforderlich ist und dann server.inject mit nicht startet tatsächlich den Server, damit ich ich glaube nicht, dass eine DB-Verbindung haben sollte, was ich sollte bedeuten würde verspotten Sie den DB-Aufruf. Was mir seltsam ist ist, dass dieser Test besteht:

'use strict'; 
const Code = require('code'); 
const Lab = require('lab'); 

const lab = exports.lab = Lab.script(); 
const describe = lab.describe; 
const it = lab.test; 
const expect = Code.expect; 
const before = lab.before; 

let server; 

describe('health controller',() => { 

    before((done) => { 
    server = require('../../server'); 
    done(); 
    }); 

    it('health check replies 200 when successful call to db', (done) => { 

    const options = { 
     method: 'GET', 
     url: '/health' 
    }; 

    server.inject(options, (res) => { 
     expect(res.payload).to.include('is running'); 
     expect(res.statusCode).to.equal(200); 

     done(); 
    }); 

    }); 

}); 

Also habe ich zwei Probleme. Zuerst denke ich, dass der obige Test nicht wirklich bestehen sollte. Es sei denn, es lädt alles auf und verbindet sich damit mit der db. Vielleicht sollte ich nur die Controller/Handler-Methode testen? Aber ich habe keine Beispiele dafür gefunden.

Zweitens habe ich versucht, den knex.raw Anruf sowieso auszugeben und wenn ich es wie folgt versuche, bekomme ich einen 500 Fehler.

'use strict'; 
const Code = require('code'); 
const Lab = require('lab'); 
const Sinon = require('sinon'); 

const lab = exports.lab = Lab.script(); 
const describe = lab.describe; 
const it = lab.test; 
const expect = Code.expect; 
const before = lab.before; 

let server; 
let knex = require('../../app/config/db').knex; 

describe('health controller',() => { 

    before((done) => { 
    server = require('../../server'); 
    done(); 
    }); 

    it('health check replies 200 when successful call to db', (done) => { 

    const stub = Sinon.stub(knex, 'raw').returns({}); 

    const options = { 
     method: 'GET', 
     url: '/health' 
    }; 

    server.inject(options, (res) => { 
     expect(res.payload).to.include('is running'); 
     expect(res.statusCode).to.equal(200); 
     expect(stub.calledOnce).to.be.true(); 
     done(); 
    }); 

    }); 

}); 

Ich bin nicht wirklich sicher, warum das passiert.

+0

Wie sieht Ihre 'require ('../../ app/config/db')' aus? Versuchen Sie in der ersten Phase, den gesamten Abfragecode in Ihre Testfalldatei einzubinden, um sicherzustellen, dass das Mocking wie erwartet funktioniert, und dann Stück für Stück den Code an den richtigen Ort zu verschieben, um den genauen Ort zu finden, an dem die Dinge nicht wie erwartet funktionierten . –

+0

Bitte geben Sie den Quellcode des '../../ servers' an. Bitte fügen Sie die Nachricht des 500-Fehler und alle Protokolle von Ihrer Konsole ein. –

+0

War meine Antwort in irgendeiner Weise hilfreich für Sie? –

Antwort

0

server.inject funktioniert genau , als ob Sie eine Anfrage an einen echten Server gemacht. Wenn Ihre Datenbank beim Ausführen des Tests aktiv ist, gibt der Endpunkt Daten aus der Datenbank zurück, genau wie beim manuellen Start des Servers.

Sinon.stub(knex, 'raw').returns({}); wird nicht funktionieren. Es wird erwartet, dass knex.raw(…) ein Versprechen zurückgibt, kein leeres Objekt. Bitte versuchen Sie Folgendes:

Sinon.stub(knex, 'raw').returns(Promise.resolve({})); 

nur eine Randnotiz: Speicher server.stop() nach jedem Test, um zwischen den Tests bestand kein Staat gibt es, um sicherzustellen, zu rufen. Im Allgemeinen denke ich, dass Sie Beispiel-Testdateien in Hapi University repository betrachten können.