ruby-on-rails-3 - 使用 Jasmine 和 Rails 3.1 测试 Coffeescript

标签 ruby-on-rails-3 coffeescript jasmine

假设我在 Coffeescript 有一个类:

class MyGame
   constructor: () ->
      @me = new Player
      @opponents = [new Player, new Player]

想在 Jasmine 中测试:
describe "MyGame", ->
   beforeEach ->
     window.game = new MyGame

   it "should have two players", ->
      expect(window.game.opponents.length).toEqual 2

但我收到错误 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

和我的jasmine.yml文件有:
src_files:
    - "app/assets/**/*.js"
    - "app/assets/**/*.coffee"
spec_files: 
    - '**/*[sS]pec.js.coffee' 
asset_pipeline_paths: 
    - app/assets 
    - spec/javascripts

我得到一个 ReferenceError: Can't find variable: MyGame所以我认为这要么是 Rails 3.1 Assets 管道的东西,要么是 Coffeescript 包装对象的方式。

最佳答案

尝试使用 @ 定义您的 CoffeeScript 类运算符:

class @MyGame
   constructor: () ->
      @me = new Player
      @opponents = [new Player, new Player]

这将允许您从任何地方访问该类,例如从您的 jasmine 测试中,并且您可以避免将测试变量附加到窗口:
describe "MyGame", ->
   beforeEach ->
     @game = new MyGame

   it "should have two players", ->
      expect(@game.opponents.length).toEqual 2

这样做的原因是,coffeescript 通过将所有内容包装在闭包中来避免引入全局变量。不幸的是,这对于面向对象的代码可能是不可取的。使用 @运算符将类定义附加到全局 this(即窗口)上,因此您可以根据需要实例化您的类。你现在可能在你的全局空间里有一些全局变量,你的类,但对我来说这是一个不错的权衡。希望这可以帮助!

关于ruby-on-rails-3 - 使用 Jasmine 和 Rails 3.1 测试 Coffeescript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7991554/

相关文章:

ruby-on-rails-3 - 在 ruby​​ on rails 中公开函数

ruby-on-rails - 使用 Devise、Doorkeeper 和 OAuth2 token 的 API 和应用程序身份验证

css - 破折号:数字小部件背景颜色

jquery - 如何在 jquery_ujs 响应中的 Javascript ERB 模板中调用 Coffeescript 模板?

javascript - 如何访问 Coffeescript 扩展类中的属性?

Angular2主题单元测试

ruby-on-rails - 在 rails 中使用带有 Jasmine 的 Spork

ruby-on-rails - twitter-bootstrap-rails gem 工作流程

ruby-on-rails - 正确的 rails 型号是什么?建议使用冗余?

javascript - 使用 Resharper 运行 jasmine 测试时设置特定端口?