Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用supertest、mocha和models进行环回测试_Node.js_Mocha.js_Loopbackjs_Supertest - Fatal编程技术网

Node.js 使用supertest、mocha和models进行环回测试

Node.js 使用supertest、mocha和models进行环回测试,node.js,mocha.js,loopbackjs,supertest,Node.js,Mocha.js,Loopbackjs,Supertest,另一方面,有一个问题是关于提供一个适当的示例,说明如何在没有环回测试的情况下实现测试。该线程讨论使用 下面是我尝试将摩卡咖啡、supertest和模型结合起来()。当我单独运行文件时,结果非常好。但是如果我有另一个测试文件(比如test teacher.js),那么第一个测试文件(称为test student.js)开始以我无法描述的奇怪方式失败 我是否遗漏了一些东西,或者模型不能像下面使用的那样使用 describe('/Student', function () { var ser

另一方面,有一个问题是关于提供一个适当的示例,说明如何在没有环回测试的情况下实现测试。该线程讨论使用

下面是我尝试将摩卡咖啡、supertest和模型结合起来()。当我单独运行文件时,结果非常好。但是如果我有另一个测试文件(比如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)

    })


})

想把这个问题变成一个答案。。。第一个问题是一个未定义的
数据源
var,但是在两个测试中,您还重新定义了
学生
。我的建议是使用已经定义的环回应用程序和模型(通常在
common/models/
)。然后测试的基本实现(我使用)类似于下面的代码(使用
mocha
chai
)。请注意每次前后的
以启动和停止服务器

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
将来自多个不同模型的所有测试作为一个套件运行,而不会出现任何故障

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

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

从哪里获取
数据源
变量?在任何情况下,同一测试中的多个文件都会共享内存,这意味着您还可以共享内存中的模型定义和数据。我猜你在那里的某个地方启动了你的LB应用,是吗?您需要确保将其关闭,但数据可能仍然存在。那是我的猜测,抓得好。剪切粘贴错误。添加了
数据源
声明。关于启动LB应用程序,我没有明确地这样做。上面的代码可以使用
mochatest/test student.js
运行。然后我可以用
mochatest
运行所有测试。通过使用服务器定义请求,它调用LB。所以。。。事实证明,在第二个文件test-teacher.js中,我还定义了
Student
。当我在test-teacher.js中注释掉
Student
时,上面的测试是有效的。显然,test-teacher.js中的测试失败了,因为它现在不涉及
Student
。请提供使用已在
common/models/
中定义的模型的示例代码。这就是示例代码?如果您的环回服务器中有模型,那么它们将通过
server.js
文件传递!请尝试查看以了解如何定义模型。我引用了
Student.updateOrCreate
,这意味着需要引用
Student
。因此,我不需要在测试中声明
Student
?类似于
var Student=
之类的东西?如果
Student
是应用程序的一部分,您不应该在应用程序中定义它吗?我不知道你为什么在测试中定义模型。。。您的模型是环回应用程序的一部分!对完全同意。既然
Student
是通过JSON定义的,那么如何访问Looopback
Student
模型呢?除了我刚刚修复的一些打字错误之外,这实际上非常有用。特别是
var request=require('supertest')(服务器)
,这样在测试中您就可以简单地执行
request.post('/api/Students')