可以在使用 MongoDB 的应用程序中 TDD/BDD 吗?
Possible to TDD/BDD in apps using MongoDB?
我想将 TDD/BDD 添加到我的 rails 应用程序,但它使用 MongoDB 来存储数据。
所以我的问题是,是否存在能够以某种方式模拟 MongoDB 或以其他方式在 MongoDB 重型 rails 应用程序中使用 TDD/BDD 的 gem?
我使用 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;
我从未在 rails 项目中使用过,但我认为您可以在 rails 中轻松加载 npm 包,并将其放入钩子中。
编写验收测试时,使用真实数据库完全没问题。验收测试是 end-to-end,毕竟应该测试整个系统的行为。
但是,当为 类 编写修改某些数据并需要保存数据的简单单元测试时,您不想依赖具体的数据库。大多数单元测试甚至不需要任何持久数据。当然,您需要告诉某些模块 'save that'、'update this'、'delete that',但是没有必要永久保存这些东西。那么为什么要费心创建数据库呢?相反,您可以创建数据映射器的模拟:
DataMapperMock
只会将您save/update 存储在内存中的任何内容。因此,当您想要测试您的应用程序是否正确创建或更新了对象时,您可以使用 DataMapperMock
而不是真实的东西来设置您的应用程序,并询问它是否已收到这些对象。所以最后模拟数据库是很容易做到的,并不需要任何特殊的框架魔法。这仅适用于不需要持久数据的测试。但即便如此,解决方案也不会太难。只需创建另一个 saves/reads 文本文件的模拟,而不是使用数据库。这很可能足以满足您的测试需求,因为您通常不会在单元测试中保存大量数据。
我想将 TDD/BDD 添加到我的 rails 应用程序,但它使用 MongoDB 来存储数据。
所以我的问题是,是否存在能够以某种方式模拟 MongoDB 或以其他方式在 MongoDB 重型 rails 应用程序中使用 TDD/BDD 的 gem?
我使用 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;
我从未在 rails 项目中使用过,但我认为您可以在 rails 中轻松加载 npm 包,并将其放入钩子中。
编写验收测试时,使用真实数据库完全没问题。验收测试是 end-to-end,毕竟应该测试整个系统的行为。
但是,当为 类 编写修改某些数据并需要保存数据的简单单元测试时,您不想依赖具体的数据库。大多数单元测试甚至不需要任何持久数据。当然,您需要告诉某些模块 'save that'、'update this'、'delete that',但是没有必要永久保存这些东西。那么为什么要费心创建数据库呢?相反,您可以创建数据映射器的模拟:
DataMapperMock
只会将您save/update 存储在内存中的任何内容。因此,当您想要测试您的应用程序是否正确创建或更新了对象时,您可以使用 DataMapperMock
而不是真实的东西来设置您的应用程序,并询问它是否已收到这些对象。所以最后模拟数据库是很容易做到的,并不需要任何特殊的框架魔法。这仅适用于不需要持久数据的测试。但即便如此,解决方案也不会太难。只需创建另一个 saves/reads 文本文件的模拟,而不是使用数据库。这很可能足以满足您的测试需求,因为您通常不会在单元测试中保存大量数据。