我已经建立了一个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
stub 实例event
, user_1
,user_2
等后,与会者报告为#<ActiveRecord::Associations::CollectionProxy []>
- 并且为空。
如果我使用 FactoryGirl 来为事件、用户等创建记录,一切正常 - 但显然这会产生不希望的结果,即它必须访问数据库(因为它使用 ActiveRecord)。
任何想法为什么 specing 会产生这个结果,并建议解决这个问题?
提前致谢。