使用Jasmine和Rails测试Coffeescript 3.1

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包装对象的方式.

Gre*_*egT 8

尝试使用@运算符定义您的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,你的课程,但对我来说这是一个很好的权衡.希望这可以帮助!