0

我一直在尝试通过一个 express node.js 项目将单元测试与我的 Backbone 模型集成,并且很难准确掌握如何完成这项任务。(旁注:我来自很多 Java 背景,我意识到存在差异,但到目前为止我喜欢节点开发环境的简单和优雅。)

我的问题源于以下问题,骨干模型需要暴露给浏览器才能在其中运行,而通过 mocha 进行的测试是节点运行时环境中的“服务器端”。

这是我正在谈论的一个例子:

模型文件:/public/js/backbone/models.js

var SomeModel = Backbone.Model.extend({...});

服务器端测试:/test/backbone/models-test.js

???

我写的 ???因为通过服务器端进行正常的单元测试,您只需执行以下操作:

var SomeModule = require('./someModule');

走你快乐的路。显然,由于浏览器不在 Node 中运行,因此模块并不容易获得。

我已经阅读了一些帖子,说明您需要将浏览器端 javascript 包装在 require.js 中,这会将这些 javascript 文件自动放入节点命名空间中,从而允许您执行 require 并继续进行测试。但是,我还没有找到一种连贯的方式来完成这样的任务,我已经尝试四处寻找示例,但似乎找不到适用的东西。诚然,这很可能是我对这个框架的普遍缺乏了解,因为我仍在思考如何在 javascript 中定义事物的范围、注入依赖项等的整个想法。

任何帮助将不胜感激,如果这个问题已经被问了一百万次,我很抱歉,我确定它已经问过了,而且我以不正确的方式问它。

提前致谢。

4

1 回答 1

5

如果你有一些仅限节点的代码(比如你的单元测试,如果你只打算在节点下执行它们),你可以采用这种方法:

  • npm 安装主干
  • var Backbone = require('backbone');
  • 只需确保您从 NPM 获得的主干版本与您发送到浏览器的版本相同。如果您愿意,您甚至可以符号链接public/js/backbone.js到下面的文件node_moules/backbone/backbone.js

如果您有仅浏览器的代码,您可以使用Backbone全局变量或它的require.js填充版本(如果您愿意)。

如果您有想要在浏览器中运行但也可以在节点中运行的代码(如模型),最干净的解决方案是使用 CommonJS(节点)样式对其进行编码var Backbone = require('backbone');并在节点中以这种方式运行,但用 requirejs 包装它/AMD 包装器,当您将其发送到浏览器并使用require.config&require.paths将“主干”映射到您的主干.js 文件时。

这个非常受欢迎的问题/答案中的详细信息:

https://stackoverflow.com/a/10914666/266795

也可以看看:

http://backbonetutorials.com/organizing-backbone-using-modules/

于 2012-12-20T22:20:33.307 回答