在没有活动记录的情况下通过关系对多态has_many进行单元测试

时间:2013-11-01 16:30:05

标签: ruby-on-rails unit-testing rspec

我已经构建了users可以参加的应用events。它们通过多态关系attendable进行映射,因为我期望创建将来可以参加的各种事物(聚会等)。

这就是它的模型:

class User < ActiveRecord::Base
  has_many :attendances, :dependent => :destroy
  has_many :events, :through => :attendances
end

class Attendance < ActiveRecord::Base
  belongs_to :attendable, polymorphic: true
  belongs_to :user
end

class Events < ActiveRecord::Base
  has_many  :attendances, as: :attendable
  has_many  :users, :through => :attendances
end

我创建了一个rails服务对象RegisterService

class RegisterService

  def initialize(event)
    @event = event
  end

  def register(users)
    reset_the_register
    users.each do |user|
      mark_user_as_present_on_run(user)
    end
    return @event.users
  end

  def mark_user_as_present_on_run(user)
    attendance = @event.attendances.build(:user_id => user.id)
    attendance.save
  end

  def reset_the_register
    @event.attendances.destroy_all
  end

end

最后,我正在尝试创建一个单元测试来测试注册操作,特别是检查它是否返回一组用户:

require "spec_helper"

describe RegisterService do
  let(:event) { stub_model Event }
  let(:register_service) { RegisterService.new(event) }

  describe '#register' do

    let(:user_1) { stub_model User }
    let(:user_2) { stub_model User }
    let(:user_3) { stub_model User }
    let(:users) { [user_1, user_2] }

    it 'returns the fulfilled attendances' do
      attendees = register_service.register(users)
      expect(attendees).to include(user_1)
      expect(attendees).to include(user_2)
    end

  end
end

问题

使用stub_model来截取实例eventuser_1user_2等,与会者报告为#<ActiveRecord::Associations::CollectionProxy []> - 并且为空。

如果我使用FactoryGirl代替为事件,用户等创建记录,一切正常 - 但显然这会产生不必要的结果,因为它必须点击数据库(因为它使用ActiveRecord)。

任何想法为什么会有这样的结果,并建议解决这个问题?

提前致谢。

1 个答案:

答案 0 :(得分:0)

Mike Feathers并没有盯着你的肩膀,对吗?点击数据库!

严重 - 如果数据库参与您正在测试的逻辑单元,则需要数据库。编写通常不会破坏数据库的测试只是一种帮助我们解决问题的思维游戏。它有助于加速可能意外地缓慢运行数据库的测试。但我们遵循这些规则,以便在需要时打破它们。