【问题标题】:Testing practices for MeteorMeteor 的测试实践
【发布时间】:2013-02-17 10:54:58
【问题描述】:

这与其说是技术问题,不如说是技术问题。我看到很多人都在使用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 工作,到目前为止我对此非常满意。它运行您的应用程序并提取您的测试文件,因此无需模拟框架的任何部分。当然,它远非完美,但它是我能够运行的第一件事,它具有我喜欢的语法,所以它赢了。感谢 jagill 的回答!

【问题讨论】:

  • 虽然我同意大型代码库的测试是一个优先事项,但我对 Meteor 上的测试有点困惑,因为我相信它包含 MVP 的哲学。您认为基于 Meteor 的测试非常必要吗?您是否打算使用 Meteor 构建一个大型应用程序并投入生产?
  • 虽然感觉就像你在引诱我对测试的优点进行一场激烈的战争,但我会看看我是否可以在不按下按钮的情况下咬住钩子。应用程序是否大规模并投入生产并不重要;重要的是,我想在创建错误后立即发现错误,因为这样更容易修复。就我而言,我使用了几个 Minimongoid 模型,这些模型具有复杂的逻辑来决定它们的行为;出错的机会很多,使用测试来驱动我的代码比点击应用程序更容易。
  • 不仅更简单,而且更快、更有效。
  • 对不起,如果您觉得“引诱”。无意冒犯。既然你已经扩展了你的问题,事情就很清楚了。谢谢。

标签: testing mocking meteor mocha.js


【解决方案1】:

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

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

【讨论】:

  • 谢谢,我一定会看看的!
  • 有没有可以mock es6导入或者mock的meteor框架?
猜你喜欢
  • 1970-01-01
  • 2011-06-29
  • 2020-02-05
  • 2011-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多