如何在咖啡脚本的特定范围内声明变量?

Posted

技术标签:

【中文标题】如何在咖啡脚本的特定范围内声明变量?【英文标题】:How do I declare a variable in a specific scope in coffeescript? 【发布时间】:2011-12-21 18:34:43 【问题描述】:

我正在尝试在使用 beforeEach 块的咖啡脚本中编写茉莉花测试。这遇到了咖啡脚本的变量范围问题。以下是我想写的:

describe 'PhoneDetailCtrl', () ->
  beforeEach () ->
    scope = angular.scope()
    $browser = scope.$service('$browser')

  it 'should fetch phone detail', () ->
    scope.params = phoneId:'xyz'
    $browser.xhr.expectGET('phones/xyz.json').respond(name:'phone xyz')
    ctrl = scope.$new(PhoneDetailCtrl)

    expect(ctrl.phone).toEqualData()
    $browser.xhr.flush()

    expect(ctrl.phone).toEqualData(name:'phone xyz')

但这不起作用,因为scope$browser 将在最内层范围内用var 声明。也就是说,一次在beforeEach 中,然后再次在it 块中。我可以通过初始化它们来强制在正确的范围内声明变量,但这似乎很奇怪:

describe 'PhoneDetailCtrl', () ->
  $browser = 
  scope = 
  beforeEach () ->
    scope = angular.scope()
    $browser = scope.$service('$browser')

  it 'should fetch phone detail', () ->
    scope.params = phoneId:'xyz'
    ...

这可行,但它编译成的 javascript 实际上是

describe('PhoneListCtrl', function() 
  var $browser, ctrl, scope;
  $browser = ;
  ctrl = ;
  scope = ;

我只需要var $browser, ctrl, scope; 行。我可以在coffeescript中更简洁地写这个吗?

【问题讨论】:

我认为将初始化程序保持在顶部这样很好。 【参考方案1】:

你做对了。

这在CoffeeScript documentation 中有描述。我不会担心它创建的 JS。是的,如果您自己编写它会有点混乱,但是当您使用像 CoffeeScript 这样的重写器时,这是您必须忍受的事情之一。

不过,您确实有几个不错的选择。

如果你愿意,你可以将变量放在当前上下文中(这恰好是你的 jasmine.Spec 对象,所以它是一个相对安全和合适的地方放置变量......只是不要覆盖existing vars in the context.):

describe 'PhoneDetailCtrl', () ->
  beforeEach () ->
    @scope = angular.scope()
    @$browser = @scope.$service('$browser')

it 'should fetch phone detail', () ->
  @scope.params = phoneId:'xyz'
  #... etc

您还可以设置自己的变量来存储东西

describe 'PhoneDetailCtrl', () ->
  setup = 

  beforeEach () ->
    setup.scope = angular.scope()
    setup.$browser = setup.scope.$service('$browser')

  it 'should fetch phone detail', () ->
    setup.scope.params = phoneId:'xyz'
    #... etc

【讨论】:

【参考方案2】:

你的测试可以这样写:

describe "MyGame", ->
    mygame = null
    beforeEach inject (_MyGame_) ->
        mygame = _MyGame_

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

更简洁的语法 - 无需全局化。

【讨论】:

您也可以使用a = b = c = d = null作为备用线路。这些变量不会相互影响(与将它们分配给 不同) 你的链接失效了。我不确定它现在是否/在哪里,或者我建议进行编辑。

以上是关于如何在咖啡脚本的特定范围内声明变量?的主要内容,如果未能解决你的问题,请参考以下文章

本地和全球范围的咖啡脚本[重复]

如何使用咖啡脚本遍历 JSON 哈希

邮递员 - 如何生成特定范围内的随机数?

如何定义常量在全局范围内nodejs

如图,如何在Unity中判断一个物体自身的旋转是不是处于某个特定范围内?

在 Unity 中,如何将值从一个脚本传递到另一个脚本?