ReferenceError:CoffeeScript + JsTestDriver + Qunit

时间:2011-06-05 17:39:02

标签: javascript tdd coffeescript qunit js-test-driver

目前我正在研究使用CoffeeScript和JsTestDriver的TDD,但是我遇到了JsTestDriver抛出的ReferenceError。

一些信息:

配置

server: http://Mark-PC:9876/capture

load:
  - js/lib/main/*.js
  - js/lib/test/sinon.js
  - js/lib/test/qunit.js
  - js/lib/test/equiv.js
  - js/lib/test/QUnitAdapter.js
  - js/coffee/main/controllers/*.js
  - js/coffee/main/models/*.js
  - js/coffee/test/controllers/*.js

控制器

class PortfolioController extends Backbone.Controller
    constructor: ->

    test: (a, b) ->
        return a + b

测试代码

module("PortfolioController", {
    setup: -> @routeSpy = sinon.spy()
    teardown: -> window.location.hash = ""
})

test 'indexRoute', ->
    c = new PortfolioController
    equals c.test(1, 1), 2, "1 + 1 = 2"

问题

JsTestDriver抛出错误

ReferenceError: PortfolioController is not defined
ReferenceError: PortfolioController is not defined
    at Object. (http://mark-pc:9876/test/js/coffee/test/controllers/PortfolioController.test.js:12:5)
    at [object Object].test indexRoute (http://mark-pc:9876/test/js/lib/test/QUnitAdapter.js:40:15)

尝试:

  • 删除jQuery,BackBone等依赖项
  • 删除了Qunit适配器并尝试使用jstestdriver断言
  • 在测试中添加了一个类,然后它可以工作

似乎有些出口问题或原型冲突?

1 个答案:

答案 0 :(得分:3)

听起来你需要让PortfolioController成为全球性的,或许可以通过添加

root = window ? global
root.PortfolioController = PortfolioController

文件的结尾,或者只是替换

class PortfolioController extends Backbone.Controller

class @PortfolioController extends Backbone.Controller

利用this是该上下文中的全局根的事实。

CoffeeScript永远不会自动导出文件范围之外的任何内容;你必须明确地做。请参阅我对此行为的解释here