1

私は2つのモデルを持っていProgramますProject. Aには sProgramがたくさんありProjectます。

App.Program = DS.Model.extend
  projects: DS.hasMany 'project', async: true

App.Project = DS.Model.extend
  program: DS.belongsTo 'program'

プログラム内のすべてのプロジェクトを表示するArrayController責任があります。レンダリングされた各プロジェクトにはdestroyリンクがあります ( での簡単なアクションArrayController)。

App.ProjectsIndexController = Ember.ArrayController.extend
  needs: 'program'
  program: Ember.computed.alias 'controllers.program.model'

  actions:
    destroy: (project) ->
      @get('program.projects').then (projects) ->
        projects.removeObject(project) # how can I test this line?
      @get('program').save()
      project.destroyRecord()

リレーションシップは非同期であるため、呼び出すとprogram.get('projects')promise が返されます。

私は Firebase (およびemberFire) をバックエンドとして使用しており、次のような関係を保存しています

programs: {
  programId: {
    projects: {
      projectId: true
    }
  }
}
projects: {
  program: 'programId'
}

スタブ/モック ライブラリにember-qunitandを使用しています。sinonこれをテストする最初の試みは、 を非常に頻繁に使用しsinon.spy()ます。

moduleFor 'controller:projects.index', 'Unit - Controller - Projects Index',
  needs: ['controller:program']

test 'actions - destroy', ->
  ctrl = @subject()
  programCtrl = ctrl.get('controllers.program')
  project1 = Em.Object.create(title: 'Project #1', destroyRecord: sinon.spy())
  project2 = Em.Object.create(title: 'Project #2', destroyRecord: sinon.spy())
  projects = Em.Object.create(removeObject: sinon.spy())
  program = Em.Object.create
    title: 'Program #1'
    projects:
      then: sinon.stub().yields(projects)
    save: sinon.spy()

  Ember.run ->
    programCtrl.set 'model', program
    ctrl.send 'destroy', project1
    ok(program.projects.then.calledOnce, 'Removes the project from the program')
    ok(program.save.calledOnce, 'Saves the program')
    ok(project1.destroyRecord.calledOnce, 'Destroys the project')

テストでモデルのインスタンスをインスタンス化する明確な方法がないため (少なくとも私は知っています)、新しい Ember オブジェクトを作成しています。アクションで呼び出されるすべての関数は を使用するsinon.spy()ため、実際に呼び出されたというアサーションを行うことができます。

Rails のバックグラウンドからすると、これは CoffeeScript の 4 行の比較的単純なテスト コードのように思えます。

いずれにせよ、私の全体的な質問は次のとおりです。

非同期コールバック関数removeObject()で実際に呼び出されたものを (sinon またはその他の方法を使用して) テストするにはどうすればよいですか?program.projects

また、上記のようにアサーションを作成できるように、すべてのテストで新しい Ember オブジェクトを作成せずにモデルをスタブする簡単な方法はありますか?

4

0 に答える 0