我一直在玩Meteor(和Meteorite),并且喜欢我开始运行的轻松程度。现在我想在应用程序中添加一些测试,发现主要障碍是在测试脚本中包含Meteor使用的包的引用/要求。
作为一个例子,我有一个我编写的简单类,它在内部使用一些下划线方法。然后我写了一个简单的摩卡脚本来测试它。
当我跑步时
mocha my_test.js
它抱怨_未定义。如果我添加
var _ = require('underscore')._
到我的测试代码,它找不到下划线库,因为这些包都被包装在一个紧密的小包中,在nodE_PATH上用于mocha的不是。我可以指定该路径,但这种硬编码路径似乎是一个坏主意。
有没有办法在Meteor环境中运行节点进程/脚本(如mocha)?我正在寻找类似于ruby-land的'捆绑exec'的东西。我已经看过陨石了,它似乎几乎把命令传递给了流星,所以我希望你们可能想要把它放在这个。
更新:
写完之后,我开始查看流星源代码。我能够写出一些主要我想要的东西,并认为Meteor团队可能会评论这是否是一条好路。从meteor shell脚本(/ usr / local / meteor / bin / meteor)开始,我在底部添加了一个case语句,它根据命令名称切换模式。此文件可以替换当前的流星启动脚本,然后添加meteor-exec到meteor和voila的链接。有了这个替换脚本,我就能以正常的方式运行流星。我也可以跑
meteor-exec `which mocha` tests/mocha_test.coffee --compilers coffee:coffee-script
我得到了我期望的结果。我可以要求('下划线')从Meteor的第三方库中提取。我可以在我的npm全球包空间中加入'mocha'和'chai'。
如果这看起来是正确的思维模式,并且代码与你们的进展方式一致,我可以提交适当的拉取请求。
替换流星shell脚本位于此要点https://gist.github.com/4416913中。我在下面添加了差异。
先谢谢
罗杰斯先生
PS。保持良好的工作。我真的很喜欢流星。
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" "$@"
答案 0 :(得分:5)
你是对的,这使你可以访问下划线和节点模块,但正如你所说,你将无法以这种方式访问流星包(即你将无法使用Meteor.Collection)。另外值得指出的是,我们的Git存储库中的admin / node.sh与您的meteor-exec
完全相同。
如果您想尝试构建更完整的解决方案,请查看app / server / server.js以了解我们如何加载包。你需要做这样的事情才能测试依赖于Meteor本身的代码。另一种方法是创建一个包装摩卡的智能包。目前还没有简单的方法可以直接从Meteor软件包中依赖NPM模块(这是在开发中),但您可以将mocha源复制到您的软件包中。然后,您可以在应用程序中运行meteor
运行mocha测试(虽然仍在运行侦听端口3000的Web服务器等)