38

beforeEach ブロックを使用する coffeescript でジャスミン テストを作成しようとしています。これは、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ただし、 andが最も内側のスコープで$browser宣言されるため、これは機能しません。varつまり、ブロック内で 1 回、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 のようなリライターを使用する場合に対処しなければならないことの 1 つです。

ただし、非常に優れたオプションがいくつかあります。

必要に応じて、現在のコンテキストに変数を配置できます (これはたまたま好奇心旺盛な 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 に答える