首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >保持Supertest直到API初始化

保持Supertest直到API初始化
EN

Stack Overflow用户
提问于 2015-02-12 12:22:13
回答 3查看 775关注 0票数 1

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

代码语言:javascript
复制
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 );
  } );
} );

当测试运行时,它会失败:

代码语言:javascript
复制
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,所以我希望从这种方法开始。

EN

回答 3

Stack Overflow用户

发布于 2015-02-19 02:25:10

您可以执行以下操作:

代码语言:javascript
复制
describe( "/api/lists", function() {
    before(function(done) {
        mongoose.connect(config.db.mongodb);
        done();
     });
     it( "should be loaded", function() {
         ....
票数 1
EN

Stack Overflow用户

发布于 2015-02-19 03:38:07

我使用Mockgoose运行测试,Mockgoose是mongoose的内存包装器。我怀疑没有可测量的连接时间。我在不指定url配置属性的test only环境中执行测试。我的mongoose初始化如下所示:

代码语言:javascript
复制
    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);
}

在我的测试中:

代码语言:javascript
复制
    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在内存中,所以速度非常快。缺点是并不是所有的mongoose操作都被mockgoose支持。我在结合使用$or和$elemMatch的查询时遇到了一些问题。

票数 0
EN

Stack Overflow用户

发布于 2015-02-23 06:07:41

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

代码语言:javascript
复制
describe('test', function () {
  before(mongoose.connect.bind(mongoose, connectionString));

  // do your tests...
);

但从我从错误消息中可以看出,您似乎未能初始化您的模型。api.js:63:5的实际代码是什么

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28469241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档