testing - Ruby on Rails - Accessing data in :has_many => :through association -
i'm trying grips type of association in rails
i have following 3 models:
user has_many: 'memberships' has_many: groups, :through => 'memberships' membership belongs_to: 'user' belongs_to 'group' group has_many: 'memberships' has_many: 'users', :through => 'memberships'
i have before_create method adds new user default user group.
user.rb attr_accessor :group_ids before_create :add_user_to_default_group after_save :update_groups def add_user_to_default_group self.group_ids = [1] end #after_save callback handle group_ids def update_groups unless group_ids.nil? self.memberships.each |m| m.destroy unless group_ids.include?(m.group_id.to_s) group_ids.delete(m.group_id.to_s) end group_ids.each |g| self.memberships.create(:group_id => g) unless g.blank? end reload self.group_ids = nil end end
i'm trying write test ensure happening correctly.
user = user.new user.username = 'testuser' user.email = 'testuser@testdomain.co.uk' user.password = 'testpass' user.password_confirmation = 'testpass' assert user.save assert user.errors.empty? assert !user.memberships.empty?
the test passes if use user.memberships.empty, not if use user.groups.empty?. under impression should able access groups through .groups?
how test user belongs default group called 'active users'?
any advice appreciated.
thanks
you might overcomplicating default group. here's came with. users , groups have name attribute in examples, keep simple.
# app/models/user.rb class user < activerecord::base has_many :memberships has_many :groups, :through => :memberships before_create :add_default_group protected def add_default_group self.groups << group.find_by_name('active users') end end # app/models/group.rb class group < activerecord::base has_many :memberships has_many :users, :through => :memberships end # app/models/membership.rb class membership < activerecord::base belongs_to :user belongs_to :group end
you need 1 callback, before_create. , test:
# test/unit/user_test.rb require 'test_helper' class usertest < activesupport::testcase def test_user_gets_default_group group = group.create(:name => 'active users') user = user.new(:name => 'test') assert user.save assert_equal [group], user.groups end end
this test not checking user has some groups, exact group you're expecting, tighter check.
Comments
Post a Comment