如何在Coffeescript中声明特定作用域的变量?

38

我正在尝试使用Coffeescript编写Jasmine测试,并使用beforeEach块。这会遇到Coffeescript变量作用域的问题。下面是我希望编写的代码:

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中更加简洁地写吗?


2
我认为将初始化程序保留在顶部是可以的。 - user24359
2个回答

30
你正在使用正确的方法。这在CoffeeScript文档中有描述。不必担心它所创建的JS代码。如果你自己编写代码,可能会有点凌乱,但这是在使用像CoffeeScript这样的重写器时必须面对的事情之一。
不过,你还有几个相当好的选择。
如果愿意,你可以将变量放在当前上下文中(对于好奇的人来说,这恰好是jasmine.Spec对象,因此把变量放在那里是一个相对安全和合适的地方……只是不要覆盖上下文中现有的变量)。
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

10

你可以编写如下的测试:

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

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

更清晰的语法 - 无需将事物设为全局。


4
你也可以使用 a = b = c = d = null 来代替空余的行。这些变量不会相互影响(与将它们分配为 {} 的情况相反)。 - Fluffy
你的链接已经失效了。我不确定它现在是否还存在,否则我会建议进行编辑。 - StackExchange What The Heck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接