我想添加TDD/BDD到我的Rails應用程序,但它使用MongoDB來存儲數據。使用MongoDB的應用程序中可能對TDD/BDD有用嗎?
所以我的問題是,是否存在可以以某種方式模擬MongoDB或其他方式在MongoDB重軌應用中使用TDD/BDD的寶石?
我想添加TDD/BDD到我的Rails應用程序,但它使用MongoDB來存儲數據。使用MongoDB的應用程序中可能對TDD/BDD有用嗎?
所以我的問題是,是否存在可以以某種方式模擬MongoDB或其他方式在MongoDB重軌應用中使用TDD/BDD的寶石?
在編寫驗收測試時,使用真實的數據庫是完全正確的。驗收測試是端到端的,並且應該測試整個系統的行爲。
但是,當編寫簡單的單元測試來修改某些數據並需要保存它時,您不想依賴具體的數據庫。大多數單元測試甚至不需要任何持久數據。你需要告訴某個模塊'保存','更新這個','刪除',當然,但沒有必要永久保存內容。那麼,爲什麼要經歷創建數據庫的麻煩?相反,你可以創建數據映射器的模擬:
的DataMapperMock
將只存儲任何你保存/更新在內存中。所以,當你想測試你的應用程序是否正確創建或更新了對象時,你可以用DataMapperMock
而不是真實的東西來設置你的應用程序,並詢問它是否已經收到這些對象。所以最後嘲笑一個數據庫很容易做,並不需要任何特殊的框架魔法。這僅適用於不需要持久數據的測試。但即使如此,解決方案也不會太難。只需創建另一個模擬,保存/讀取文本文件,而不是使用數據庫。這對你的測試來說很可能是足夠好的,因爲你通常不會在單元測試中保存大量數據。
我使用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包,並把這個鉤子。
爲什麼不使用真實的東西? –
你的意思是讓構建腳本創建一個,啓動它,停止它並刪除成功的構建? –
不,讓它永遠運行。然後根據需要創建/刪除集合/文檔。 –