我有两个模型,Program
和Project
。AProgram
有很多Project
s。
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
和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 对象,因为在我的测试中没有明确的方法来实例化我的模型实例(至少我知道)。在动作中被调用的每个函数都使用 asinon.spy()
所以我可以断言它们确实被调用了。
来自 Rails 背景,这似乎是针对四个相对简单的 CoffeeScript 行的大量测试代码,这让我相信我可能会以错误的方式处理这个问题。
无论哪种方式,我的总体问题是:
我如何测试(使用 sinon 或任何其他方式)removeObject()
实际上是在program.projects
异步回调函数中调用的?
另外,有没有一种更简单的方法可以让我在每次测试中不创建新的 Ember 对象的情况下对模型进行存根,这样我就可以像上面那样做出断言?