38

我正在尝试在使用 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'})

但是,这不起作用,因为scopeand$browservar在最内部的范围内声明。也就是说,一次在块中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中更简洁地写这个吗?

4

2 回答 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
于 2011-11-04T09:51:11.190 回答
10

你的测试可以这样写:

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

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

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

于 2012-08-16T00:44:18.640 回答