2017-05-04 6 views
0

Ich verwende mocha, nodejs und pg-promise, die Verbindung zu einer Postgres db. Ich frage mich, wie kann ich eine Funktion testen, die eine DML ausführt? Dies ist nur ein einfaches Beispiel:Komponententestfunktionen Verbinden mit einem Postgres-DB

export function insertUser(db, { firstName, lastName }) { 
    db.one(` 
    INSERT INTO users 
    (
     firstName, 
     lastName 
    ) 
    VALUES 
    (
     $<firstName>, 
     $<lastName> 
    ) 
    `, { firstName, lastName }); 
} 

Wenn es ein Tippfehler in der Abfrage ist, wie kann die Unit-Test-Capture es? Ich kann eine Test-Datenbank erstellen, indem ich temporäre Tabellen im laufenden Betrieb erstelle, aber dadurch wird mein Test verlangsamt.

+0

Anwendungsbeispiel: https://coderwall.com/p/axugwa/cleaning-the-database-in-between-mocha-tests-with-pg-promise –

+0

@ vitaly-t - Ich kann mehrere Probleme mit diesem zu sehen Ansatz. Erstens verlangsamt es den Komponententest, da es sich mit der DB verbindet. Zweitens wird es schwieriger zu pflegen sein, da wir eine neue Testdatenbank erstellen müssen, die das genaue Replikat der Hauptdatenbank ist. Drittens ist es so, als würden wir die pg-promise-Funktionalität testen. Beim Komponententest haben wir davon ausgegangen, dass pg-promise von sich aus ordnungsgemäß getestet wurde, sodass die Funktionalität nicht getestet werden muss. – Chris

+0

Moderne Tests für Datenbank-Code erfordert eine gute Isolation, was bedeutet, dass Sie solche Systeme wie Travis CI verwenden, die Ihnen eine neue Datenbank für jedes Ihrer PR-s gibt, was der richtige Weg ist. Und wenn Sie Tests lokal ausführen, sind sie überhaupt nicht langsam, sie sind sehr schnell, ich mache es die ganze Zeit. Auch, keine Ahnung was du meinst mit 'es ist wie testen pg-versprechen Funktionalität'. –

Antwort

1

Da die Variable db ein Funktionsparameter ist, ist das Unit-Testen dieser Art von Code einfach.

Gehen Sie voran und installieren Sie eine Mocking-Bibliothek. Wir hatten einen guten Erfolg mit sinonjs.

npm install sinon --save-dev 

Mit der Mock-Bibliothek in Ort, den Sie nun die Unit-Test, etwas entlang der Linien schaffen können wie folgt:

const should = require('should'), 
     sinon = require('sinon'), 
     helper = require('your-db-module'); 

describe('DB functions',() => { 
    describe('insertUser',() => { 
    const { insertUser } = helper; 

    it('correctly inserts a new user',() => { 
     const db = { 
     one: sinon.stub() 
     }; 

     insertUser(db, { firstName: 'john', lastName: 'doe' }); 

     db.one.calledWithExactly('INSERT INTO users(firstName, lastName) VALUES($<firstName>, $<lastName>)', { firstName: 'john', lastName: 'doe'}).should.eql(true); 
    }); 
    }); 
}); 

Dass Sie auf dem rechten Fuß setzen soll.

+0

Also müssen wir die Abfrage vom Code zum Test replizieren. Ich dachte nur, dass ein Entwickler bei diesem Ansatz einfach die Abfrage aus dem Test kopieren und in den Code einfügen würde. Was passiert, wenn ich "INSERT" auf "INSET" falsch gesetzt habe? Wie kann ein Unit-Test diesen Fehler erkennen? – Chris

+0

IMHO, sollten Sie den Test schreiben, bevor Sie die Funktion selbst schreiben, um das zu vermeiden. Darüber hinaus müssten Sie 1 oder mehrere Funktionstests in diesem Codebereich durchführen, um zu überprüfen, ob die Funktionen wie erwartet funktionieren. Das sollte mehr als ausreichend Testabdeckung sein, um fortzufahren. –

Verwandte Themen