私は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-qunit
andを使用しています。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 オブジェクトを作成せずにモデルをスタブする簡単な方法はありますか?