meteortesting mocha --full-app 正在执行 0 个测试

meteortesting mocha --full-app is executing 0 tests

我有基于wekan的流星应用https://github.com/wekan/wekan

我已经在 /test 目录中编写了一些测试。

对于我的测试,我使用 https://github.com/meteortesting/meteor-mocha

当我 运行 meteor test --driver-package meteortesting:mocha 测试 运行 但由于我的代码未完全加载而失败。

所以我尝试使用 --full-app 参数。现在应用程序代码已加载并且 运行 已经完成,但执行了 0 个测试。

这里有什么问题?

如何使用所有代码执行我的测试?

我经常阅读这个问题,所以让我把它分开,因为有多种做事的方法。顺便说一句 - 如果您有一个新项目,您很可能已经在避免预先加载。

预加载

这个选项是在 Meteor 1.3 中引入的,从那以后一直是默认选项。

当运行 meteormeteor run 处于此模式时,将自动加载除文件夹/imports 中的文件以外的所有文件。还有一些其他规则,都可以在此页面上找到:https://guide.meteor.com/structure.html#load-order

当 运行 在此模式下进行测试时,会应用不同的规则,实际上不会加载与以下表达式不匹配的文件:

  • meteor test 仅加载匹配 *.test[s].**.spec[s].*
  • 的文件
  • meteor test --full-app 仅加载匹配 *.app-test[s].**.app-spec[s].*
  • 的文件

可以(如您所习惯的那样)像往常一样导入其他文件。所有这些都可以在这个页面上找到:https://guide.meteor.com/testing.html#test-modes

避免预先加载

从 Meteor 1.7 开始,在讨论如何摆脱这个特殊的 /imports 目录 (https://github.com/meteor/meteor-feature-requests/issues/135) 之后,引入了一种新方法:

当项目的 package.json 文件中存在如下部分时,Meteor 将仅加载相应模式下的那些文件:

"meteor": {
  "mainModule": {
    "client": "client/main.js",
    "server": "server/main.js"
  },
  "testModule": {
    "client": "client/tests.js",
    "server": "server/tests.js"
  }
}

在此模式下,您可以通过 Meteor.isAppTest() 区分测试和 full-app 测试。

如果某个部分不存在,则使用预先加载代替此部分。我们在我们的项目中使用预先加载进行测试,但更喜欢 non-eager 主应用程序的方式。因此我们只定义了mainModule部分,而没有定义testModule部分。

遗憾的是,这些细节在流星指南中没有得到很好的呈现。它们可以在 Meteor 1.7 的发行说明中找到:https://docs.meteor.com/changelog.html#changes-21

希望这有助于更好地了解文件加载的工作原理。