3

我玩 Meteor(和 Meteorite)已经有一段时间了,我很喜欢我可以轻松启动和运行。现在我想向应用程序添加一些测试,发现主要障碍是在测试脚本中包含对 Meteor 使用的包的引用/要求。

例如,我编写了一个简单的类,它在内部使用了一些下划线方法。然后我写了一个简单的 mocha 脚本来测试它。

当我跑

mocha my_test.js

它抱怨 _ 未定义。如果我添加

var _ = require('underscore')._

对于我的测试代码,它找不到下划线库,因为这些包都包裹在一个紧凑的小包中,而该包不在mocha 的 NODE_PATH 上。我可以指定该路径,但这种硬编码路径似乎是个坏主意。

有没有办法在 Meteor 环境中运行节点进程/脚本(如 mocha)?我正在寻找类似于 ruby​​-land 的“bundle exec”的东西。我研究过 Meteorite,它似乎几乎可以将命令直接传递给 Meteor,所以我希望你们可能想要使用这个。

更新:

写完这篇,我开始看流星源代码。我能够写出一些主要做我想做的事情,并且认为 Meteor 团队可能会评论这是否看起来是一条好路。从流星外壳脚本(/usr/local/meteor/bin/meteor)开始,我在底部添加了一个 case 语句,它根据命令名称切换模式。该文件可以替换当前的流星启动脚本,然后添加从流星执行到流星的链接,瞧。使用这个替换脚本,我可以正常运行流星。我也可以跑

meteor-exec `which mocha` tests/mocha_test.coffee --compilers coffee:coffee-script

我得到了我期望的结果。我可以 require('underscore') ,它是从 Meteor 的第三方库中提取的。我可以在我的 npm 全局包空间中包含“mocha”和“chai”。

如果这看起来是正确的心态,并且代码与你们可能进行的方式一致,我可以提交适当的拉取请求。

替换流星 shell 脚本在这个要点https://gist.github.com/4416913中。我在下面添加了差异。

提前致谢

罗杰斯先生

附言。保持良好的工作。我真的很喜欢流星。

diff meteor meteor.orig 
105,116c105,106
< NPM_GLOBAL_PATH=$(npm root -g)
< METEOR_THIRD_PARTY="$DEV_BUNDLE/app/lib/third"
< case $(basename $0) in
<   meteor)
<     export NODE_PATH="$DEV_BUNDLE/lib/node_modules"
<     exec "$DEV_BUNDLE/bin/node" "$METEOR" "$@"
<     ;;
<   meteor-exec)
<     export NODE_PATH="$DEV_BUNDLE/lib/node_modules:$METEOR_THIRD_PARTY:$DEV_BUNDLE/packages:$NPM_GLOBAL_PATH"
<     exec "$DEV_BUNDLE/bin/node" "$@"
<     ;;
< esac
---
> export NODE_PATH="$DEV_BUNDLE/lib/node_modules"
> exec "$DEV_BUNDLE/bin/node" "$METEOR" "$@"
4

1 回答 1

5

没错,这使您可以访问下划线和节点模块,但正如您所说,您将无法以这种方式访问​​流星包(即您将无法使用 Meteor.Collection)。还值得指出的是,我们 Git 存储库中的 admin/node.sh 与您的meteor-exec.

如果您想尝试构建更完整的解决方案,请查看 app/server/server.js 以了解我们如何加载包。您需要执行类似的操作才能测试依赖 Meteor 本身的代码。另一种方法是创建一个智能包包装 mocha。目前没有简单的方法可以直接从 Meteor 包中依赖 NPM 模块(这正在开发中),但是您可以将 mocha 源代码复制到您的包中。然后你就可以meteor在你的应用程序中运行你的 mocha 测试(尽管仍然运行一个监听端口 3000 的 web 服务器等)

于 2013-01-05T01:40:10.663 回答