在nodejs上使用mocha测试backbonejs

时间:2012-06-28 10:38:49

标签: node.js backbone.js requirejs mocha

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

我的mocha测试文件: 测试/ 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文件: 公共/ Javascript角/视图/ test_view.coffee

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

在public / javascripts / libs中,我有jquery,backbone和underscore的缩小(不是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的paths属性。 如果我从路径中删除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中。 我删除它,现在摩卡正在运行测试。但是我得到了错误:

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

行:

view = new TestView()

导致错误。

1 个答案:

答案 0 :(得分:0)

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