2

(这类似于这个问题:如何在流星中建立单独的测试和开发数据库,​​但是它已经有 2 年历史了,从那时起流星发生了很大的变化。)

我正在尝试创建自己的包,并且我想运行单元测试。我想确保我的查询是正确的,所以我想对测试数据库实际运行查询,而不仅仅是对函数进行存根。

我有两个问题:

  • 我如何告诉 Meteor 运行测试数据库而不是我的真实数据库?
  • 用数据轻松填充测试数据库的最佳方法是什么?

理想情况下,我需要一个设置步骤来清除而不是填充测试数据库,所以我总是确切地知道每个数据库中的数据。

我是 Tinytest 新手(尽管我使用过其他单元测试框架),因此非常感谢代码示例。

4

1 回答 1

3

这是一个类似于我们使用的示例:

var resetCollection = function(name) {
  var Collection = this[name];
  if (Collection)
    // if the collection is already defined, remove its documents
    Collection.remove({});
  else
    // define a new unmanaged collection
    this[name] = new Mongo.Collection(null);
};

reset = function() {
  var collections = ['Comments', 'Posts'];

  // reset all of the collections
  _.each(collections(function(name) {resetCollection(name);}));

  // insert some documents
  var postId = Posts.insert({title: 'example post'});
  Comments.insert({postId: postId, message: 'example comment'});
};

Tinytest.add('something', function(test) {
  reset();

  var post = Posts.findOne();
  var comment = Comments.findOne();
  return test.equal(comment.postId, post._id);
});

在我们调用的每个测试开始时,reset它会清理数据库并创建必要的集合。

我如何告诉 Meteor 运行测试数据库而不是我的真实数据库?

当您测试您的包时,将为您创建一个单独的数据库。无需手动指定您的数据库路径。

用数据轻松填充测试数据库的最佳方法是什么?

上面的例子应该给你一些指示。我发现避免包之间冲突的最佳方法是在测试中使用非托管集合(名称 = null)。该resetCollection函数应正确避免重新定义由其他包导出的任何托管集合。另请参阅此问题以获取更多详细信息。

于 2015-04-21T18:27:55.940 回答