使用超级,摩卡和模型进行环回测试

use*_*342 11 mocha.js node.js supertest loopbackjs

关于弃用环回测试谷歌小组发布的帖子中有一个问题,即提供一个如何在没有环回测试的情况下实现测试的正确示例.该线程谈论使用supertest而不是.

下面是我尝试将Mocha,supertest和模型(来自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)

    })


})
Run Code Online (Sandbox Code Playgroud)

use*_*342 15

基于jakerella对前一个答案的反馈,我更改了上面的代码,以便我不必在代码中从头开始重新定义模型(感谢jakerella!)

使用下面的代码,我可以将多个不同模型的所有测试作为单个套件运行,npm test无需任何故障.

因为我只对个别订单感兴趣...所以不需要倾听和关闭.我怀疑,如果我正在测试创建的模型的整体实例,那么它将成为必需.

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)
     })
})
Run Code Online (Sandbox Code Playgroud)

  • 除了我刚刚解决的一些错别字,这实际上非常有帮助.特别是`var request = require('supertest')(server)`所以在测试中你可以简单地做`request.post('/ api/Students')`. (2认同)

jak*_*lla 8

想把它折腾成答案......第一个问题是一个未定义的dataSourcevar,但是你也在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);
        }
      });
  });
});
Run Code Online (Sandbox Code Playgroud)