2017-07-14 9 views
0

単純な単体テストでのmockgooseの使用はかなり簡単です。しかし、合格テストやインテグレーションテストでは、モックゴースや他のモッキングソリューションをどのように使用するのか、少しばかげています。エクスプレスアプリ統合テストでのmockgoose(または他のdb mocking)の使用方法

を考えると、次のようなシンプルな特急/ MongoDBのアプリ:

/*app.js*/ 

const express = require('express') 
const app = express() 
var mongoose = require('mongoose'); 
mongoose.connect('mongodb://localhost/test'); 

var greetingSchema = mongoose.Schema({ 
    greeting: String 
}); 

var Greeting = mongoose.model('Greeting', greetingSchema); 

app.get('/', function (req, res) { 
    Greeting.find({greeting: 'Hello World!'}, function (err, greeting){ 
    res.send(greeting); 
    }); 
}); 

app.listen(3000, function() { 
    console.log('Example app listening on port 3000!') 
}) 

と、このような単純な統合テスト:要求で実際のアプリを使用することにより

/*test.js*/ 

const app = require('app.js'); 
const request = require('supertest'); 

it('sends "Hello World!" on the response body', (done) => { 
    request(app) 
     .get('/') 
     .expect(200, 'Hello World!', done); 
    }); 
}); 

を、我々はに接続していますアプリケーションのデータベース( 'mongodb:// localhost/test')。 MongoDBデータベースを模擬して、上に示したような統合テストを実行するには、mockgooseやその他のソリューションをどのように使用できますか?

答えて

5

私はあなたと同じ問題がありました。

db.js

const mongoose = require('mongoose'); 
const config = require('../../config'); 
mongoose.Promise = global.Promise; 
mongoose.set('debug', process.env.DEBUG != undefined); 

function open(){ 
    return new Promise((resolve, reject) => { 
     if(process.env.DEBUG != undefined) { 
      let Mockgoose = require('mockgoose').Mockgoose; 
      let mockgoose = new Mockgoose(mongoose); 
      mockgoose.helper.setDbVersion("** your mongodb version **"); 
      mockgoose.prepareStorage().then(function() { 
       mongoose.connect(config.db_test, (err, res) => { 
        if (err) return reject(err); 
        resolve(); 
       }); 
      }).catch(reject); 
     }else{ 
      mongoose.connect(config.db, (err, res) => { 
       if (err) return reject(err); 
       resolve(); 
      }); 
     } 
    }); 
} 

function close(){ 
    return mongoose.disconnect(); 
} 

module.exports = { close, open }; 

app.js

const express = require('express'); 

const bodyParser = require('body-parser'); 
const api = require('./routes'); 

app.use(bodyParser.urlencoded({ extended: false })); 
app.use(bodyParser.json()); 

app.use('/api', api); 

module.exports = app; 

私の場合、私はchai + chai-httpを使用して、別のファイルにDB接続やアプリを壊す解決しましたtest.js(テスト用):

(開発や生産のため)の

index.js

const conn = require('./utils/db'); // <-- db.js 
const app = require('./app'); // <-- app.js 
const config = require('./config'); 

conn.open().then(() => { 
    app.listen(config.port,() => { 

     // OK! 

    }); 
}); 

私はそれはあなたや、誰のために働く願っています。

+0

驚くばかりです。あなたがapp.jsファイルにデータベース接続を持っているようには思えません。 app.jsファイル内からdb.open()を呼び出すべきではありませんか? – neoflash

+1

@neoflash DB接続後に 'conn.open()'と 'app.listen'を持つindex.jsを持っています; – lmfresneda

+0

@Imfresnedaあなたの答えにindex.jsを追加してもよろしいですか? – neoflash

関連する問題