使用 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/
中)。然后(我使用的)测试的基本实现类似于下面的代码(使用 mocha
和 chai
).注意 beforeEach
和 afterEach
来启动和停止服务器。
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)
})
})
上的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/
中)。然后(我使用的)测试的基本实现类似于下面的代码(使用 mocha
和 chai
).注意 beforeEach
和 afterEach
来启动和停止服务器。
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)
})
})