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.
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 . –
Bitte geben Sie den Quellcode des '../../ servers' an. Bitte fügen Sie die Nachricht des 500-Fehler und alle Protokolle von Ihrer Konsole ein. –
War meine Antwort in irgendeiner Weise hilfreich für Sie? –