2

我有一个 nodejs 应用程序,它具有使用backbonejs 和requirejs 构建的客户端代码。我想使用 mocha 在我的 nodejs 服务器上测试客户端代码。

我的摩卡测试文件:test/view.coffee

requirejs = require 'requirejs'
global.define = requirejs

requirejs.config
  nodeRequire: require
  baseUrl: '../public/javascripts/libs/'
  paths:
    jquery: "jquery"
    Underscore: "underscore"
    Backbone: "backbone"
  shim:
    'jquery':
      exports: '$'
    'Underscore':
      exports: '_'
    'Backbone':
      deps: ['jquery', 'Underscore']
      exports: 'Backbone'

requirejs ['../public/javascripts/views/test_view'], (TestView) ->
  describe 'TestView', ->
    view = new TestView()

要测试的 Backbonejs 文件:public/javascripts/views/test_view.coffee

define [
  'Backbone'
], (Backbone) ->
  class TestView extends Backbone.View
    initialize: ->
      ...
  TestView

在 public/javascripts/libs 中,我有 jquery、主干和下划线的缩小(不是 AMD)版本。

当我运行测试时,我收到以下错误消息:

Error: Calling node's require("../public/javascripts/views/test_view")
failed with error: Error: Calling node's require("Underscore")
failed with error: Error: Cannot find module 'Underscore'
  at /node_modules/requirejs/bin/r.js:2262:27

不知何故,未读取 test/view.coffee 中 requirejs.config 的路径属性。如果我从路径中删除 Backbone: "backbone",我不会收到模块 'Backbone' 丢失的错误消息。我没有在 nodejs 服务器上安装 Backbone 和 Underscore。

编辑: 通过将 requirejs.config baseUrl 更改为“public/javascripts/views/test_view”来修复路径问题。Requirejs 没有使用 baseUrl 块的文件路径(test/view.coffee)。对于 requirejs ['...'], (TestView) 部分,我必须使用 test/view.coffee 文件的路径。

当我使用 mocha 运行测试时,出现以下错误:

throw e; // process.nextTick error, or 'error' event on first tick
              ^
Error: Calling node's require("../public/javascripts/views/test_view")
  failed with error: TypeError: Object #<Object> has no method 'load'

编辑: 我忘了提到我已将“jade!templates/test_template”添加到我的 test_view 中。我删除了它,现在 mocha 正在运行测试。但我得到了错误:

TypeError: object is not a function
  at Object.CALL_NON_FUNCTION_AS_CONSTRUCTOR (native)

该行:

view = new TestView()

导致错误。

4

1 回答 1

0

这里的问题是,在服务器上,RequireJS 回退到节点的 require()。一个可能的解决方案是使用 NPM 安装 Backbone,并将 node_modules/backbone/backbone.js 符号链接到 public/lib/backbone.js。然后,您可以使用节点或 RequireJS 的 require() 来要求主干。

于 2012-06-28T12:49:38.770 回答