【问题标题】:Holding Supertest Until API Initialized保持超测直到 API 初始化
【发布时间】:2015-04-12 16:52:17
【问题描述】:

我使用使用 MongoDB 的 express API 的 Supertest 进行了 mocha 测试。 MongoDB 正在运行,但我目前有 Supertest 要求并使用 express API,而不是单独启动它(我更喜欢这种方法):

var request = require( 'supertest' );
var chai = require( 'chai' );
var api = require( '../../server/api.js' );

chai.should();

describe( "/api/lists", function() {
    it( "should be loaded", function() {
        api.should.exist;
    } );
    it( "should respond with status 200 ", function( done ) {
        request( api )
            .get( '/api/lists' )
            .expect( 200, done );
  } );
} );

测试运行时失败:

TypeError: Cannot call method 'collection' of undefined
    at app.get.listId (/my/path/api.js:63:5)

我怀疑 supertest 在建立 MongoDB 连接之前正在我的 API 上运行测试。什么是让它在我的 API 完全初始化之前推迟的正确方法?

我想如果我在启动 express 后通过 Grunt 运行测试,那会很好,但是由于 Supertest 可以代表我启动 express,我希望从这种方法开始。

【问题讨论】:

    标签: node.js mocha.js supertest


    【解决方案1】:

    您可以执行以下操作:

    describe( "/api/lists", function() {
        before(function(done) {
            mongoose.connect(config.db.mongodb);
            done();
         });
         it( "should be loaded", function() {
             ....
    

    【讨论】:

      【解决方案2】:

      我使用 Mockgoose 运行测试,Mockgoose 是 mongoose 的内存包装器。我怀疑没有可测量的连接时间。我使用未指定我的 url 配置属性的仅测试环境执行测试。我的猫鼬初始化是这样的:

          if (url) {
          config.logger.info('Attempting Mongoose Connection: ', url);
          db.connection = connection = mongoose.createConnection(url, {
              server: {
                  keepAlive: 1, auto_reconnect: true
              },
              user: db.username,
              pass: db.password
          });
      } else {
          config.logger.info('No database specified, using Mockgoose in memory database');
          config.mockgoose = require('mockgoose')(mongoose);
      }
      

      在我的测试中:

          describe('Mockgoose tests', function() {
          beforeEach(function(done) {
              config.mockgoose.reset(); // Start with empty database
              // Other database initialization code here
              done();
          }
      
          it('Mockgoose test', function(done) {
              ...
          }
      }
      

      这允许我将数据集或单个对象加载到数据库中。由于 mockgoose 在内存中,它非常快。缺点是 mockgoose 并不支持所有的 mongoose 操作。我遇到了结合 $or 和 $elemMatch 的查询的问题。

      【讨论】:

        【解决方案3】:

        由于 Mongoose 会在连接可用之前缓冲查询,因此以下设置就足够了:

        describe('test', function () {
          before(mongoose.connect.bind(mongoose, connectionString));
        
          // do your tests...
        );
        

        但是从我可以通过错误消息得知的情况来看,您似乎无法初始化模型。 api.js:63:5 的实际代码是什么?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-08-16
          • 2012-02-16
          • 1970-01-01
          • 1970-01-01
          • 2020-02-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多