ruby on rails - How do I test these callbacks on 1 of my models? -
please note: this question may seem similar my other question, , that...similar. not identical. replicated of info because relevant question. being said, didn't want overwhelm either question many requests, split them up.
i relatively new testing, please forgive me if question seems basic.
i using rspec, shoulda, factorygirl , faker. class user.
these schema & associations user model:
# == schema information # # table name: users # # id :integer not null, primary key # email :string(255) default(""), not null # encrypted_password :string(255) default("") # reset_password_token :string(255) # reset_password_sent_at :datetime # remember_created_at :datetime # sign_in_count :integer default(0), not null # current_sign_in_at :datetime # last_sign_in_at :datetime # current_sign_in_ip :string(255) # last_sign_in_ip :string(255) # created_at :datetime # updated_at :datetime # first_name :string(255) # confirmation_token :string(255) # confirmed_at :datetime # confirmation_sent_at :datetime # unconfirmed_email :string(255) # invitation_relation :string(255) # avatar :string(255) # invitation_token :string(255) # invitation_created_at :datetime # invitation_sent_at :datetime # invitation_accepted_at :datetime # invitation_limit :integer # invited_by_id :integer # invited_by_type :string(255) # invitations_count :integer default(0) # bio :text # last_name :string(255) # gender :integer default(0) # has_one :family_tree, dependent: :destroy has_many :memberships, dependent: :destroy has_many :nodes, dependent: :destroy has_many :comments, dependent: :destroy enum gender: { male: 0, female: 1 } after_create :create_family_tree after_destroy :remove_all_memberships after_invitation_accepted :send_emails the methods (which callbacks) unsure of testing are:
private def create_family_tree family_tree = self.build_family_tree(name: "#{name}'s family tree") family_tree.save! end def remove_all_memberships memberships = membership.includes(:user).where(user_id: self.id) memberships.destroy_all end def send_emails invited_user = self inviter_user = self.invited_by welcome_message = inviteacceptance.welcome_to_invited_user_after_signing_up(invited_user, inviter_user) welcome_message.deliver notification_message = inviteacceptance.notification_that_invited_user_signed_up(inviter_user, invited_user) notification_message.deliver end this user_spec.rb far, tests associations , gender value, both of fine:
require 'rails_helper' describe user { should have_one(:family_tree) } { should have_many(:memberships) } { should have_many(:nodes) } { should have_many(:comments) } "should return gender enum value, 0 = male, , 1 = female" expect(build(:user).gender).to eq "female" end end this spec/factories/users.rb
factorygirl.define factory :user first_name { faker::name.first_name } last_name { faker::name.last_name } email { faker::internet.email } password { faker::internet.password(10) } password_confirmation { faker::internet.password(10) } bio { faker::lorem.paragraph } invitation_relation { faker::lorem.word } # required if devise confirmable module used confirmed_at time.now gender 1 end end i guess real question is, how write tests methods , how test callbacks separately?
i test methods normally, not worrying used callbacks. means establish known state, perform operation, , check desired state, each one.
then, can use shoulda-callback-matchers verify proper callbacks in place without writing ton of code.
alternatively, establish known state, run callback method performing operation triggers callback, , check desired state.
Comments
Post a Comment