目前,我正在研究使用CoffeeScript和JsTestDriver的TDD,但是我仍然停留在JsTestDriver引发的ReferenceError上。

一些信息:


使用IntelliJ JsTestDriver插件
通过Chrome测试
以与以下相同的方式配置JsTestDriver:http://code.google.com/p/js-test-driver/wiki/QUnitAdapter
用CoffeeScript编写测试
在运行测试之前,将CoffeeScript编译为javascript并放入配置的目录中


设定档

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断言
在测试本身内部添加了一个类,然后就可以了


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

最佳答案

听起来您需要将PortfolioController设置为全局变量,也许可以通过添加

root = window ? global
root.PortfolioController = PortfolioController


文件末尾,或通过简单地替换

class PortfolioController extends Backbone.Controller




class @PortfolioController extends Backbone.Controller


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

CoffeeScript永远不会自动导出超出文件范围的任何内容。您必须明确地做到这一点。请参阅我对这种行为的解释here

09-25 17:23