在nodejs上使用mochatesting主干

我有一个nodejs应用程序,它具有用backbonejs和requirejs构build的客户端代码。 我想使用摩卡在我的nodejs服务器上testing客户端代码。

我的摩卡testing文件: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() 

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

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

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

当我运行我的testing时,我得到以下错误信息:

 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属性不被读取。 如果我从path中删除Backbone:“backbone”,我不会收到错误信息,说明模块“Backbone”缺失。 我没有在nodejs服务器上安装Backbone和Underscore。

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

当我用摩卡运行我的testing时,我得到以下错误:

 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。 我删除了它,现在摩卡正在运行testing。 但是我得到的错误:

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

该行:

 view = new TestView() 

导致错误。

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