我已经构建了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
来截取实例event
,user_1
,user_2
等,与会者报告为#<ActiveRecord::Associations::CollectionProxy []>
- 并且为空。
如果我使用FactoryGirl代替为事件,用户等创建记录,一切正常 - 但显然这会产生不必要的结果,因为它必须点击数据库(因为它使用ActiveRecord)。
任何想法为什么会有这样的结果,并建议解决这个问题?
提前致谢。
答案 0 :(得分:0)
严重 - 如果数据库参与您正在测试的逻辑单元,则需要数据库。编写通常不会破坏数据库的测试只是一种帮助我们解决问题的思维游戏。它有助于加速可能意外地缓慢运行数据库的测试。但我们遵循这些规则,以便在需要时打破它们。