2017-02-13 7 views
0

TDD/BDDをレールアプリに追加したいのですが、MongoDBを使ってデータを保存しています。MongoDBを使用しているアプリでTDD/BDDが可能ですか?

私の質問は、MongoDBやMongoDB heavy railアプリケーションでTDD/BDDを使用するための何か他の手段を何とかシミュレートできる宝石が存在するのでしょうか?

+1

なぜ本物を使わないのですか? –

+0

ビルドスクリプトを作成して起動し、停止し、ビルドが成功したら削除しますか? –

+0

いいえ、常に実行させてください。そしてあなたが望むようにコレクション/文書を作成/削除してください。 –

答えて

1

受験テストを書くときには、実際のデータベースを使用するのはまったく問題ありません。受け入れテストはエンドツーエンドで、システム全体の動作をテストすることになっています。

しかし、いくつかのデータを変更して保存する必要があるクラスに対して単体テストを書くときには、具体的なデータベースに頼ることは望ましくありません。ほとんどのユニットテストでは永続的なデータは必要ありません。あなたは、あるモジュールに「保存する」、「これを更新する」、「削除する」ということを伝える必要がありますが、永久に保存する必要はありません。それでは、なぜデータベースを作成するのが難しいのですか?代わりに、あなたのデータマッパーのモックを作成することができます。

Data Mapper UML

DataMapperMockはちょうどあなたがメモリに/更新を保存する何かを格納します。したがって、アプリケーションがオブジェクトを正しく作成または更新したかどうかをテストする場合は、実際のものではなくDataMapperMockでアプリケーションを設定し、これらのオブジェクトを受け取ったかどうかを尋ねるだけです。だから、最終的には、データベースの作成は非常に簡単で、特別なフレームワークの魔法を必要としません。これは永続データを必要としないテストにのみ適用されます。しかし、それでもソリューションはそれほど難しくありません。データベースを使用する代わりにテキストファイルを保存/読み込む別のモックを作成するだけです。単体テストで大量のデータを保存することは通常ありませんので、テストには十分に適しています。

1

私はnode.jsモジュールhttps://github.com/mafintosh/mongojsを使用して私のmongoを作成していますので、mongoの日付を簡単に作成して削除することができます。

var mongo = require('mongodb'); 
var assert = require('assert'); 
var Long = require('mongodb').Long; 
var MongoClient = mongo.MongoClient; 

var url = 'mongodb://127.0.0.1:27017/my_mongodb_path'; 
var ObjectId = mongo.ObjectID; 

var MongoInsert = function() { 
var myJsonData = [ 
    {'_id' : ObjectId('58334b5573835c48f22fb7a0'), 
    'mydate' : 'informations'} 
]; 

var insertDocuments = (db, data, tableName, callback) => { 
    var collection = db.collection(tableName); 

collection.insertMany(data, (err, result) => { 
    assert.equal(err, null); 
    assert.equal(1, result.result.n); 
    assert.equal(1, result.ops.length); 
    console.log(''+tableName+' inserted with success .'); 
    callback(result); 
    }); 
}; 

MongoClient.connect(url, (err, db) => { 
    assert.equal(null, err); 
    var myTable = 'table1'; 

    insertDocuments(db, myJsonData, table1,() => { 
    db.close(); 
    }); 
}); 
}; 
module.exports = MongoInsert; 

私はレールプロジェクトでは一度も使用しませんでしたが、レールにnpmパッケージを簡単にロードして、フックに入れることができます。

関連する問題