2015-02-12 57 views
1

我有一個使用Supertest的使用MongoDB的快速API的摩卡測試。 MongoDB是跑步,但我目前有Supertest要求和使用Express API而不是單獨啓動它(我更喜歡這種方法):在API初始化之前持有Supertest

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可以代表我開始表達,所以我希望能夠以這種方式開始。

回答

1

你可以做到以下幾點:

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

我使用Mockgoose,一個在內存包裝的貓鼬運行我的測試。我懷疑沒有可衡量的連接時間。我使用僅測試環境執行測試,但未指定我的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。我遇到了結合$或$ elemMatch的查詢問題。

0

由於貓鼬緩衝查詢,直到連接可用,下面的設置應該足夠:

describe('test', function() { 
    before(mongoose.connect.bind(mongoose, connectionString)); 

    // do your tests... 
); 

但是,從我可以通過錯誤消息告訴,它看起來像你無法初始化您的模型。什麼是api.js:63:5的實際代碼?

相關問題