Meteor的测试实践

Sam*_*amo 9 testing mocking mocha.js meteor

这不是技术问题; 我看到很多人都在使用看起来很整洁的Mocha,所以我会尝试一下.

我想知道的是人们如何处理测试与Meteor集合相关的模型之类的东西.你会用sinon来模拟数据库记录吗?是否存在require可以使用的框架文件,以便您可以使用Meteor.Collection

编辑

更具体地说,我正在编写一个使用几个Minimongoid模型的应用程序.如果您已经看过其中一个,那么您知道每个模型的@_collection属性都是new Meteor.Collection(...).

拥有模型而不是数据库记录的主要优点之一是您可以将行为附加到它,而这种行为就是我想要测试的行为.

所以,假设你在棋盘上有一个涉及两件的游戏.当玩家点击一块时,我们希望通过突出显示方块来显示棋盘上的所有合法移动.该作品有一种方法,根据作品的移动方式以及是否有其他作品确定给定位置是否构成合法移动; 确定路上是否有碎片可能需要数据库查询:

class Piece extends Minimongoid
  @_collection: new Meteor.Collection('pieces')

  @find: (selector = {}, options = {}) ->
    document = @_collection.findOne(selector, options)
    if document
      model = new @(document)
      _.extend(model, model.attributes)

  @where: (selector = {}, options = {}) ->
    @_collection.find(selector, options).map (record) =>
      model = new @(record)
      _.extend(model, model.attributes)

class Bishop extends Piece
  @code: "bishop"

  isLegalMove: (location) ->
    @isOnMyPath(location) && @noPiecesInMyWay(location)

  noPiecesInMyWay: (location) ->
    _.all Piece.where({ color: @otherColor() }), (piece) -> 
      !piece.isOnMyPath(location) || (piece.location == location && piece.color == @otherColor())
Run Code Online (Sandbox Code Playgroud)

因此,如果我使用测试框架加载此类,我实际上只看到两个用于测试此代码的选项:

  1. 使用像sinon这样的东西来模拟@_collection对象
  2. 让Meteor(或其中的一部分)由测试框架加载,以便我的模型可以访问 Meteor.Collection

更新

大约一年后,我回到这里,尝试了一些建议的测试方法.

我看了一下RTD,它似乎是所有可用解决方案中最完整的,但我无法运行它.

我也看过Laika,但真的不关心语法.我想要一种BDD风格的语法,而Laika提供的内容相当神秘.

然而,经过一些试验和错误,我能够让meteor-mocha-web工作,到目前为止我对它非常满意.它运行您的应用程序并提取您的测试文件,因此无需模拟框架的任何部分.它当然远非完美,但它是我能够运行的第一件事,它具有我喜欢的语法,所以它赢了.感谢jagill的答案!

jag*_*ill 3

在尝试测试我们的应用程序MadEye.io时,我们遇到了类似的问题。有很多移动部件和边缘情况,因此自动化套件至关重要。我们构建了一个包meteor-mocha-web来支持在Meteor上下文中进行测试,包括Session、Meteor.Collections、Deps等。我们还在Meteor的Devshop 0上进行了一次闪电演讲,对其进行了简要解释。

虽然还处于早期阶段,但它对我们来说非常宝贵,并且它涵盖了人们需要的更多用例。