9

这不是技术问题。我看到很多人都在使用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())

所以如果我用一个测试框架加载这个类,我真的只看到两个测试这个代码的选项:

  1. 用 sinon 之类的东西模拟 @_collection对象
  2. 让测试框架加载 Meteor(或它的一部分),以便我的模型可以访问Meteor.Collection

更新

大约一年后,我又回到了这个问题上,并尝试了一些建议的测试方法。

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

我也看过Laika,但真的不关心语法。我想要一个 BDD 风格的语法,相比之下,Laika 提供的语法看起来相当神秘。

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

4

1 回答 1

3

在尝试测试我们的应用程序MadEye.io时,我们遇到了类似的问题。有很多移动部件和边缘案例,所以自动化套件是必不可少的。我们构建了一个包meteor-mocha-web以支持在Meteor 上下文中进行测试,包括Session、Meteor.Collections、Deps 等。我们还在Meteor 的Devshop 0 上进行了一次Lightning Talk简要解释。

这是早期阶段,但它对我们来说是无价的,它涵盖了人们需要的更多用例。

于 2013-04-11T16:33:19.603 回答