用超级,摩卡和模型进行环回testing

在Google组织发布弃用回送testing的post时,有一个问题,就是提供一个适当的例子,说明如何在没有回送testing的情况下实现testing。 那个线程讲的是使用supertest来代替。

下面是我将Mocha,超模与模型( 来自app.js )结合在一起的尝试。 当我自己运行文件时,结果效果非常好。 但是如果我有另一个testing文件(比如test-teacher.js),那么第一个testing文件(称为test-student.js)就会以我无法描述的奇怪方式开始失败。

我错过了什么东西,或者模型不能像我在下面使用它们一样使用?

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) }) }) 

基于上一个答案,来自jakerella的反馈,我改变了上面的代码,以便我不必在代码中重新定义模型(谢谢jakerella!)

使用下面的代码,我可以使用npm test将所有来自多个不同模型的testing作为一个套件npm test而不会出现任何故障。

由于我只对单个订单感兴趣,因此不需要聆听和closures。 我怀疑,如果我正在testing创build的模型的整体实例,它将成为必需的。

 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) }) }) 

想要把这个变成一个答案…第一个问题是一个未定义的dataSource ,但是你也在你的两个testing中重新定义了Student 。 我的build议是使用LoopBack应用程序和已经定义的模型(通常是common/models/ )。然后testing(我使用的)的基本实现类似于下面的代码(使用mochachai )。 注意beforeEachafterEach来启动和停止服务器。

 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: 'john@doe.com', 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); } }); }); });