【发布时间】:2011-11-22 12:53:33
【问题描述】:
我目前正在处理 PeepCode video on Backbone.js,但尝试用 CoffeeScript 而不是纯 JavaScript 编写它。
到目前为止一切顺利,除非我尝试对遇到一些 TypeErrors 的代码运行 Jasmine 测试:
TypeError: Cannot call method 'isFirstTrack' of undefined
TypeError: Cannot call method 'get' of undefined
我的 CoffeeScript/Backbone 文件如下所示:
jQuery ->
class window.Album extends Backbone.Model
isFirstTrack: (index) ->
index is 0
class window.AlbumView extends Backbone.View
tagName: 'li'
className: 'album'
initialize: ->
@model.bind('change', @render)
@template = _.template $('#album-template').html()
render: =>
renderedContent = @template @model.toJSON()
$(@el).html(renderedContent)
return this
还有这样的 Jasmine 测试规范:
var albumData = [{
"title": "Album A",
"artist": "Artist A",
"tracks": [
{
"title": "Track A",
"url": "/music/Album A Track A.mp3"
},
{
"title": "Track B",
"url": "/music/Album A Track B.mp3"
}]
}, {
"title": "Album B",
"artist": "Artist B",
"tracks": [
{
"title": "Track A",
"url": "/music/Album B Track A.mp3"
},
{
"title": "Track B",
"url": "/music/Album B Track B.mp3"
}]
}];
describe("Album", function () {
beforeEach(function () {
album = new Album(albumData[0]);
});
it("creates from data", function () {
expect(this.album.get('tracks').length).toEqual(2);
});
describe("first track", function() {
it("identifies correct first track", function() {
expect(this.album.isFirstTrack(0)).toBeTruthy();
})
});
});
我猜这个问题与 CoffeeScript 将所有内容包装在一个函数中有关。当我从等式中删除 jQuery 时,它工作正常。
奇怪的是,即使 Jasmine 告诉我TypeError: Cannot call method 'isFirstTrack' of undefined,如果我在页面上的控制台中运行album.isFirstTrack(0),它也会返回true,所以窗口确实可以访问变量和方法。
【问题讨论】:
-
在挖掘了更多之后 - 我已经设法修复它。从 Jasmine 测试规范中的两个
expect语句中删除this关键字似乎有效。仍然有兴趣了解为什么 - 这是范围问题吗? -
问题不在于 CoffeeScript 的函数包装器。通过将它们定义为
window.Album和window.AlbumView,您已经正确导出了两个类。
标签: javascript backbone.js coffeescript jasmine