2016-01-26 13 views
11

Auf der Google groups post on deprecating loopback-testing gibt es eine Frage, die ein gutes Beispiel dafür liefert, wie Tests ohne Loopback-Test durchgeführt werden können. Dieser Thread spricht davon, stattdessen supertest zu verwenden.Loopback-Test mit Supertest, Mocha und Modellen

Unten ist ein Versuch, den ich gemacht habe, um Mocha, superest zusammen mit Modellen (from app.js) zu kombinieren. Das Ergebnis funktioniert sehr gut, wenn ich die Datei selbst ausführe. Aber wenn ich eine andere Testdatei hatte (zB test-teacher.js), dann beginnt die erste Testdatei (nenne sie test-student.js) auf seltsame Weise zu versagen, was ich nicht beschreiben kann.

Fehle ich etwas oder können Modelle nicht benutzt werden, wie ich sie unten verwende?

describe('/Student', function() { 

    var server = require('../server/server') 
    var loopback = require('loopback') 
    var supertest = require('supertest') 
    var request = require('supertest')(server) 

    var dataSource = server.dataSource('db', {adapter: 'memory'}) 

    var Student = dataSource.define('Student', { 
     'id': Number, 
     'points': Number 
    }); 

    beforeEach(function() { 
     Student.updateOrCreate({id: 1, points: 5000}); 
    }) 


    it('Post a new student', function (done) { 
     request.post('/api/Students').send({points: 5000}).expect(200, done) 

    }) 


}) 
+1

Woher beziehen Sie die Variable 'dataSource'? In jedem Fall führen mehrere Dateien im selben Test alle gemeinsam aus, dh Sie teilen auch Modelldefinitionen und Daten im Speicher. Ich schätze, dass Sie Ihre LB-App dort irgendwo starten, ja? Sie müssen sicherstellen, dass die Daten geschlossen werden, die Daten können jedoch weiterhin bestehen bleiben. Das wäre meine Vermutung. – jakerella

+0

Ausgezeichneter Fang. Fehler beim Ausschneiden und Einfügen Deklaration von 'dataSource' hinzugefügt. WRT zum Starten der LB-App, ich mache es nicht explizit. Der obige Code kann mit 'mocha test/test-student.js' ausgeführt werden. Und dann kann ich alle Tests mit 'Mokka-Test' durchführen. Durch die Definition der Anfrage beim Server wird LB aufgerufen. – user465342

+0

Also ... stellt sich heraus, dass ich in der zweiten Datei test-teacher.js auch 'Student' definiert habe. Wenn ich 'Student' in test-teacher.js ausdentiere, funktioniert der obige Test. Dann scheitert natürlich der Test in test-teacher.js, weil es jetzt nicht um 'Student' geht. – user465342

Antwort

15

Basierend auf dem Feedback von jakerella auf der vorherigen Antwort, änderte ich den obigen Code, so dass ich die Modelle von Grund auf neu im Code nicht neu definieren müssen (dank jakerella!)

Mit dem Code Unten kann ich alle Tests von mehreren verschiedenen Modellen als eine einzige Suite mit npm test ohne Fehler ausführen.

Da ich nur an einzelnen Aufträgen interessiert bin ... zuhören und schließen waren nicht nötig. Ich vermute, dass es erforderlich wäre, wenn ich insgesamt Instanzen von erstellten Modellen testen würde.

describe('/Student', function() { 

    var server = require('../server/server') 
    var request = require('supertest')(server) 
    var expect = require('expect.js') 

    var Student 

    before(function() { 
     Student = server.models.Student  
    }) 

    beforeEach(function (done) { 
     Student.upsert({id: 1, points: 5000}, function() { done() }) 
    })  

    it('Post a new student', function (done) { 
     request.post('/api/Students').send({points: 5000}).expect(200, done) 
    }) 
}) 
+2

Abgesehen von einigen Tippfehlern, die ich gerade behoben habe, ist das tatsächlich sehr hilfreich. Vor allem die 'var request = erfordern ('supertest') (server)', so dass man in den Tests einfach 'request.post ('/ api/Students')' machen kann. –

8

wollte diese in eine Antwort werfen ... die erste Ausgabe war ein undefinierter dataSource var, aber dann hatte man auch Student in Ihren beiden Tests neu definiert. Meine Empfehlung stattdessen ist die LoopBack-App und Modelle bereits definiert (in der Regel in common/models/) .Dann ist die grundlegende Implementierung zum Testen (die ich verwende) ist etwas wie der Code unten (mit mocha und chai). Beachten Sie die beforeEach und afterEach zum Starten und Stoppen des Servers.

var assert = require('chai').assert, 
    superagent = require('superagent'), 
    app = require('../server/server'); 

describe('Person model', function() { 
    var server; 

    beforeEach(function(done) { 
    server = app.listen(done); 
    }); 

    afterEach(function(done) { 
    server.close(done); 
    }); 

    it('should log in and log out with live server', function(done) { 
    superagent 
     .post('http://localhost:3000/api/People/login') 
     .send({ email: '[email protected]', password: 'foobar' }) 
     .set('Accept', 'application/json') 
     .set('Content-Type', 'application/json') 
     .end(function(err, loginRes) { 
     if (err) { return done(err); } 

      assert.equal(loginRes.status, 200); 
      assert.ok(loginRes.body); 
      assert.equal(loginRes.body.userId, 1); 
     } 
     }); 
    }); 
}); 
+0

Bitte geben Sie einen Beispielcode für die Verwendung der bereits in 'common/models /' definierten Modelle an. – user465342

+1

Das * ist * der Beispielcode ...? Wenn Ihr LoopBack-Server Modelle enthält, werden diese über die Datei 'server.js' weitergeleitet! Versuchen Sie, auf der [Docs-Website] (https://docs.strongloop.com/display/public/LB/Defining+models) nachzulesen, wie Sie Modelle definieren. – jakerella

+0

Ich referenziere 'Student.updateOrCreate', was bedeutet, dass ein Verweis auf' Student' benötigt wird. Muss ich Student nicht innerhalb des Tests deklarieren? Etwas wie 'var Student =' etwas? – user465342

Verwandte Themen