如何使用最小和meteorjs的Stub对象?

时间:2015-07-27 13:38:32

标签: testing meteor meteor-velocity

本周末我试着测试一个包#A;#34;来自我的流星应用程序。 这个包依赖于另一个包" B"定义所有集合。包裹" B"公开所有必需的集合。

包裹" A"公开一个主对象,它有一些方法使用" B"。

中公开的集合

我想用这样的代码替换一些集合:

myCol = {
    "findOne": return {_id: 1, "name": ben}
}

但它失败了。这段代码可以从tinytest.add代码中获得,但是在包的方法中,它仍然使用原始的Collection变量。#34; A"我在构建文件夹中看到所有内容都是由构建系统重写的,所以我想知道在不依赖于那些Collection变量的情况下测试代码的最佳方法是什么。 我有一些想法,比如将这些变量存储在具有get / set方法的主对象中。当我做测试时,它可能允许我改变一切。

感谢您的帮助

以下是示例应用:https://github.com/MeteorLyon/tutorial-package-dependancy-testing 按照README.md运行不同的测试。 如果你找到了解决方案,那就太棒了。

1 个答案:

答案 0 :(得分:1)

如果您正在寻找存根,我强烈建议您使用sinon。具体来说,请查看文档的stubssandbox部分。您可以找到气氛套餐here。这是一个简单的例子:

Tinytest.add('my test', sinon.test(function(test) {
  // this is sandboxed stub - we are writing to a global object
  // but it will be restored at the end of the test
  test.stub(Meteor, 'userId', function() {
    return USER_ID;
  });

  // let's do the same thing with a collection
  test.stub(Posts, 'findOne', function() {
    return {_id: 1, name: 'ben'};
  });

  var post = Posts.findOne();
  test.equal(post.name, 'ben');
}));

请记住,tinytest是一个集成测试框架,因此您可以通过充分利用两个软件包的API来获得更好的测试。关于测试集合交互,我们发现最好不要非常存根,只需根据需要插入和清理。但这是非常普遍的建议 - 可能有一些特定的原因可以解释为什么这种情况在你的特定用例中起作用。