可以在使用 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 文本文件的模拟,而不是使用数据库。这很可能足以满足您的测试需求,因为您通常不会在单元测试中保存大量数据。