Mor*_*ten 5 coffeescript ruby-on-rails-3 jasmine
假设我在Coffeescript中有一节课:
class MyGame
constructor: () ->
@me = new Player
@opponents = [new Player, new Player]
Run Code Online (Sandbox Code Playgroud)
想在Jasmine中测试一下:
describe "MyGame", ->
beforeEach ->
window.game = new MyGame
it "should have two players", ->
expect(window.game.opponents.length).toEqual 2
Run Code Online (Sandbox Code Playgroud)
但我得到错误TypeError: Result of expression 'window.game.opponents' [undefined] is not an object.?
这种window.game方法对我来说也很尴尬.如果我尝试定义它,因为@game = new MyGame我得到错误,ReferenceError: Can't find variable: MyGame但我想这与Coffeescript包装的方式有关?
更新:问题似乎更像是如上所述的参考问题.我正在跑步guard-jasmine,看起来像
guard 'jasmine', :all_on_start => false, :all_after_pass => false do
watch(%r{app/assets/javascripts/(.+)\.(js\.coffee|js)}) { |m| "spec/javascripts/#{m[1]}_spec.#{m[2]}" }
watch(%r{spec/javascripts/(.+)_spec\.(js\.coffee|js)}) { |m| "spec/javascripts/#{m[1]}_spec.#{m[2]}" }
watch(%r{spec/javascripts/spec\.(js\.coffee|js)}) { "spec/javascripts" }
end
Run Code Online (Sandbox Code Playgroud)
我的jasmine.yml文件有:
src_files:
- "app/assets/**/*.js"
- "app/assets/**/*.coffee"
spec_files:
- '**/*[sS]pec.js.coffee'
asset_pipeline_paths:
- app/assets
- spec/javascripts
Run Code Online (Sandbox Code Playgroud)
我得到了一个,ReferenceError: Can't find variable: MyGame所以我认为它是Rails 3.1资产管道或Coffeescript包装对象的方式.
尝试使用@运算符定义您的coffeescript类:
class @MyGame
constructor: () ->
@me = new Player
@opponents = [new Player, new Player]
Run Code Online (Sandbox Code Playgroud)
这将允许您从任何地方访问该类,例如从您的jasmine测试,并且您也可以远离将测试变量附加到窗口:
describe "MyGame", ->
beforeEach ->
@game = new MyGame
it "should have two players", ->
expect(@game.opponents.length).toEqual 2
Run Code Online (Sandbox Code Playgroud)
这样做的原因是coffeescript不会通过将所有内容包装在闭包中来避免引入全局变量.遗憾的是,这对于面向对象的代码来说可能是不合需要的.使用@运算符将类定义附加到全局this(即窗口),从而允许您根据需要实例化类.你现在可以在你的全球空间中拥有一些全球性的vars,你的课程,但对我来说这是一个很好的权衡.希望这可以帮助!