2017-02-13 52 views
0

我想添加TDD/BDD到我的Rails應用程序,但它使用MongoDB來存儲數據。使用MongoDB的應用程序中可能對TDD/BDD有用嗎?

所以我的問題是,是否存在可以以某種方式模擬MongoDB或其他方式在MongoDB重軌應用中使用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; 

我從來沒有在軌項目中使用,但我fink會你就可以在滑軌容易負載NPM包,並把這個鉤子。

相關問題