我有一个网络应用程序,客户端的东西是用coffeescript编写的,并加载了require.js.
我希望能够使用基于节点的测试运行程序(例如expresso)来隔离和测试这些内容(尽管欢迎其他建议),以便我可以将客户端测试与我们的CI服务器(目前是Team City)集成
这是我的目录设置:
.
├── coffee
│ ├── models
│ ├── node_modules
│ │ └── expresso
│ ├── spec
│ ├── tests
│ └── views
├── static
│ └── js
│ ├── lib
│ ├── models
│ ├── tests
│ └── views
这些是使用require.js连接的,如下所示:
deps = [
"lib/backbone", "models/websocket_collection", "/static/js/lib/date.js"
]
define(deps, (Backbone, ws) ->
# module code and exports here
然后加载到浏览器中:
<script type="text/javascript" charset="utf-8" async="" data-requirecontext="_" data-requiremodule="my_mod" src="/static/js/my_mod.js"></script>
在一个创意世界中,我希望能够拥有一个看起来像的测试模块:
{Model1, Model2} = require "models/some_module"
exports.test_a = ->
assert.equal # etc etc
我有几个问题(除非我使用zombie.js时没有真正使用过节点服务器端)
如何告诉node我的所有普通javascript依赖项(在static / js / lib中)其中一些是下载的,但是backbone.js已经标记为require.js定义类似的东西
define(function(require, exports, module) {
(function(){
我如何实际运行测试?我已经尝试过r.js(根据我的理解,它应该是浏览器端需求和节点需求之间的桥梁)
我得到的问题是:
ReferenceError: define is not defined
我也试过要求(“allplugins-require”)这是我加载浏览器端以收集我所有客户端代码的脚本,但这似乎打破了节点的要求。
我很高兴听到人们正在使用的替代方法。
谢谢, 本
答案 0 :(得分:3)
通过节点are here中的r.js运行requirejs的文档。特别是,r.js用自己的节点替换节点的需求。只要npm安装的模块对require.js配置不可见,它就可以加载通过npm安装的仅节点的软件包/模块。
另一个警告是r.js需要是main.js的兄弟文件,这是在节点环境中运行的顶级app js文件。
r.js的最新代码将支持将requirejs作为节点模块加载(如require('requirejs'),这将提供更好的集成故事。该更改将在0.26.0版本中。
答案 1 :(得分:2)
我花了很长时间试图让它发挥作用并最终放弃了。我确实通过引用全局变量中的所有require.js依赖项并将其用于node.js测试来实现它,但设计非常难看,我觉得我已经打败了这一点。
我目前的做法是:
这对我来说效果很好,但需要注意以下几点:
答案 2 :(得分:1)
好的,几天黑客攻击,我现在已经将我的客户端代码(其中一些)打包为commonjs模块并使用jasmine-node进行测试。
如果有人感兴趣我已经分叉jasmine-node来添加与CI服务器集成的xml文件的输出。这很好用。
我会在缝合并运行后报告回来。