单元测试调用异步关系的控制器操作

时间:2014-05-18 13:46:56

标签: ember.js ember-qunit

我有两个模型,ProgramProjectProgram有许多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-qunitsinon作为存根/模拟库。我第一次尝试对此进行测试会大量使用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行的测试代码,这让我相信我可能会以错误的方式解决这个问题。

不管怎样,我的整体问题是:

我如何测试(使用sinon或任何其他方式)removeObject()实际上在异步回调函数中调用program.projects

另外,在我没有在每次测试中创建新的Ember对象的情况下,我是否有更简单的方法来存根我的模型,这样我就能像上面那样进行断言?

0 个答案:

没有答案