3

我有一个 Web 应用程序,其中客户端的东西是用 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外,没有真正使用过节点服务器端)

  1. 我如何告诉节点我所有的普通 javascript 依赖项在哪里(在 static/js/lib 中)其中一些是下载的,但是backbone.js 已经被标记为 require.js 定义像这样的东西

    define(function(require, exports, module) {
        (function(){
    
  2. 我如何实际运行测试?我试过 r.js (据我所知,它应该是浏览器端要求和节点要求之间的桥梁)

我遇到的问题是:

ReferenceError: define is not defined

我也尝试过 require("allplugins-require") 这是我加载浏览器端以收集所有客户端代码的脚本,但这似乎破坏了节点的要求。

  • 有人这样做吗?
  • 如果您不这样做,您将如何测试您的代码(与 CI 集成的奖励积分)?
  • 用于管理客户端依赖项的 require.js 的任何替代方案可能在服务器端发挥更好的作用?

我很高兴听到人们正在使用的替代方法。

谢谢,本

4

3 回答 3

3

在 node 中通过 r.js 运行 requirejs 的文档在这里。特别是,r.js 用它自己的替换了 node 的 require。只要 npm 安装的模块对 require.js 配置不可见,它就可以加载通过 npm 安装的仅节点包/模块。

另一个需要注意的是,r.js 需要是 main.js 的兄弟文件,main.js 是在节点环境中运行的顶级应用程序 js 文件。

r.js 的最新代码将支持将 requirejs 作为节点模块加载(如在 require('requirejs') 中,这将提供更好的集成故事。该更改将在 0.26.0 版本中进行。

于 2011-08-14T07:38:37.077 回答
2

我花了很长时间试图让它发挥作用,最终放弃了。通过在全局变量中引用我所有的 require.js 依赖项并将其用于 node.js 测试,我确实让它工作了,但是设计是如此丑陋,以至于我觉得我已经失败了。

我目前的做法是:

  • 将我的 JavaScript 模块编写为 CommonJS 模块
  • 使用Jasmine BDD 节点集成在服务器端测试我的模块
  • 使用stitch使CommonJS模块在客户端工作

这对我来说效果很好,但有以下注意事项:

  • 客户端调试很困难,因为stitch 连接了我所有的脚本。我发现从针脚配置中省略像 jQuery 这样的库有助于解决这个问题。
  • 我没有任何方法来调试服务器端。有一个node.js 调试器,但它不适用于最近几个版本的 node。
于 2011-08-13T03:28:38.680 回答
1

好的,几天后,我现在已经将我的客户端代码(其中一些)打包为 commonjs 模块并使用 jasmine-node 进行了测试。

如果有人感兴趣,我已经分叉了 jasmine-node 以添加与 CI 服务器集成的 xml 文件的输出。这工作得很好。

我会在我缝合并运行后报告。

这是我的叉子:https ://github.com/boothead/jasmine-node

于 2011-08-17T14:20:56.807 回答