使用 supertest、mocha 和模型进行环回测试

Loopback testing with supertest, mocha and models

上的Google groups post on deprecating loopback-testing there is a question that asks about providing a proper example of how testing can be achieved without loopback-testing. That thread talks about using supertest代替。

下面是我尝试将 Mocha、supertest 与模型结合起来的尝试 (from app.js)。当我 运行 文件本身时,结果非常好。但是如果我有另一个测试文件(比如 test-teacher.js),那么第一个测试文件(称之为 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)

    })


})

想把它扔到一个答案中...第一个问题是未定义的 dataSource 变量,但随后您还在两个测试中重新定义了 Student。我的建议是使用已经定义的 LoopBack 应用程序和模型(通常在 common/models/ 中)。然后(我使用的)测试的基本实现类似于下面的代码(使用 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);
        }
      });
  });
});

根据 jakerella 对上一个答案的反馈,我更改了上面的代码,这样我就不必在代码中从头开始重新定义模型(感谢 jakerella!)

使用下面的代码,我可以 运行 使用 npm test 将来自多个不同模型的所有测试作为一个套件进行,没有任何失败。

因为我只对单个订单感兴趣... listen 和 close 不是必需的。我怀疑如果我正在测试创建的模型的整体实例,它将成为必需的。

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