0

我已经建立了一个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_modelstub 实例event, user_1,user_2等后,与会者报告为#<ActiveRecord::Associations::CollectionProxy []>- 并且为空。

如果我使用 FactoryGirl 来为事件、用户等创建记录,一切正常 - 但显然这会产生不希望的结果,即它必须访问数据库(因为它使用 ActiveRecord)。

任何想法为什么 specing 会产生这个结果,并建议解决这个问题?

提前致谢。

4

1 回答 1

0

Mike Feathers 没有盯着你的肩膀,对吧?打数据库!

说真的 - 如果数据库参与您正在测试的逻辑单元,那么您需要数据库。编写通常不会影响数据库的测试只是一种帮助我们解耦事物的思维游戏。它有助于加快可能意外缓慢运行数据库的测试。但是我们遵循这些规则,以便我们可以在需要时打破它们。

于 2013-11-01T16:35:12.673 回答