【问题标题】:Possible to TDD/BDD in apps using MongoDB?可以在使用 MongoDB 的应用程序中进行 TDD/BDD 吗?
【发布时间】:2017-02-13 11:43:29
【问题描述】:

我想将 TDD/BDD 添加到我的 rails 应用程序中,但它使用 MongoDB 来存储数据。

所以我的问题是,是否存在可以以某种方式模拟 MongoDB 或其他方式在 MongoDB 重轨应用程序中使用 TDD/BDD 的 gem?

【问题讨论】:

  • 为什么不用真品?
  • 你的意思是让构建脚本创建一个,启动它,停止它并在成功构建时删除?
  • 不,让它一直运行。然后根据需要创建/删除集合/文档。
  • 在您的测试环境中不使用 MongoDB 有什么特殊原因吗?
  • 您可能想使用 Factory Girl 和可能的 Database Cleaner。如果您使用 Mongoid,则不需要 Database Cleaner。

标签: ruby-on-rails ruby mongodb tdd bdd


【解决方案1】:

当您编写验收测试时,使用真实的数据库是完全可以的。验收测试是端到端的,毕竟应该测试整个系统的行为。

但是,在为修改某些数据并需要保存数据的类编写简单的单元测试时,您不想依赖具体的数据库。大多数单元测试甚至不需要任何持久数据。您将需要告诉某些模块“保存”、“更新”、“删除”,当然,但不需要永久保存内容。那么为什么要麻烦创建一个数据库呢?相反,您可以创建数据映射器的模拟:

DataMapperMock 只会将您保存/更新的任何内容存储在内存中。因此,当您想测试您的应用程序是否正确创建或更新了对象时,您可以使用DataMapperMock 而不是真实的东西来设置您的应用程序,并询问它是否收到了这些对象。所以最终模拟数据库非常容易,并且不需要任何特殊的框架魔法。这仅适用于不需要持久数据的测试。但即便如此,解决方案也不会太难。只需创建另一个模拟来保存/读取文本文件,而不是使用数据库。这很可能对您的测试足够好,因为您通常不会在单元测试中保存大量数据。

【讨论】:

    【解决方案2】:

    我使用 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 项目中使用过,但我认为您可以轻松地将 npm 包加载到 rails 中,并将其放入挂钩中。

    【讨论】:

      猜你喜欢
      • 2016-02-18
      • 2012-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-15
      相关资源
      最近更新 更多