【问题标题】: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中更简洁地写这个吗?

【问题讨论】:

  • 我认为将初始化程序保持在顶部这样很好。

标签: coffeescript jasmine


【解决方案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作为备用线路。这些变量不会相互影响(与将它们分配给 {} 不同)
    • 你的链接失效了。我不确定它现在是否/在哪里,或者我建议进行编辑。
    猜你喜欢
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    相关资源
    最近更新 更多