0

我正在使用RSpec和Factory Girl。爲什麼我的工廠和測試不像我期望的那樣工作?

這是我在一個高層次的關聯:

User 
    has_one :family_tree, dependent: :destroy 
    has_many :memberships, through: :family_tree, dependent: :destroy 

Family Tree 
    belongs_to :user 
    has_many :memberships, dependent: :destroy 
    has_many :members, through: :memberships, dependent: :destroy 

Membership 
    belongs_to :family_tree 
    belongs_to :user 
    belongs_to :member 

Member 
    has_many :memberships, dependent: :destroy 

這是方法my_relativesUser類:

def my_relatives 
    self.family_tree.memberships.pluck(:relation) 
    end 

這些都是我的工廠:

用戶

factory :user do 
    association :family_tree 
    first_name { Faker::Name.first_name } 
    last_name { Faker::Name.last_name } 
    email { Faker::Internet.email } 
    password "password123" 
    password_confirmation "password123" 
    bio { Faker::Lorem.paragraph } 
    invitation_relation { Faker::Lorem.word } 
    # required if the Devise Confirmable module is used 
    confirmed_at Time.now 
    gender 1 
    end 

會員

factory :member do 
    first_name { Faker::Name.first_name } 
    last_name { Faker::Name.last_name } 
    email { Faker::Internet.email } 
    bio { Faker::Lorem.paragraph } 
    gender 1 
    end 

成員

factory :membership do 
    family_tree 
    user 
    relation { Faker::Lorem.word } 
    member 
    end 

家譜

factory :family_tree do 
    name { Faker::Name.name } 
    end 

這是我的測試:

it "should return all the relatives of a user" do 
    u1 = create(:user) 
    ft = create(:family_tree, user: u1) 
    relation = "nephew" 
    u2 = create(:user) 
    membership = create(:membership, user: u2, relation: relation, family_tree: ft) 
    expect(u1.my_relatives).to eq(u2.memberships.where(relation: relation).pluck(:relation)) 
    end 

當我運行RSpec的,這是我得到的錯誤:

1) User should return all the relatives of a user 
    Failure/Error: expect(u1.my_relatives).to eq(u2.memberships.where(relation: relation).pluck(:relation)) 

     expected: [] 
      got: ["nephew"] 

     (compared using ==) 

爲什麼我會得到一個空數組作爲我的主要u1.my_relatives期待?

當我通過變量會在運行時用撬,我得到這個:

1] pry(#<RSpec::ExampleGroups::User>)> u1 
=> #<User id: nil, email: "[email protected]", encrypted_password: "$2a$04$EJWX5sLmBtDBgyA8tf35y.1FfhQcLRY3EAU/JxL8/tN...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, created_at: "2015-10-26 23:15:30", updated_at: "2015-10-26 23:15:30", first_name: "Brooks", confirmation_token: nil, confirmed_at: "2015-10-26 23:15:27", confirmation_sent_at: nil, unconfirmed_email: nil, invitation_relation: "similique", avatar: nil, invitation_token: nil, invitation_created_at: nil, invitation_sent_at: nil, invitation_accepted_at: nil, invitation_limit: nil, invited_by_id: nil, invited_by_type: nil, invitations_count: 0, bio: "Reiciendis ea omnis. Saepe ea amet nostrum deserun...", last_name: "Yost", gender: 1> 
[2] pry(#<RSpec::ExampleGroups::User>)> ft 
=> #<FamilyTree id: nil, name: "Ms. Milan Goldner", user_id: 1197, created_at: "2015-10-26 23:15:30", updated_at: "2015-10-26 23:15:30"> 
[3] pry(#<RSpec::ExampleGroups::User>)> relation 
=> "nephew" 
[4] pry(#<RSpec::ExampleGroups::User>)> u2 
=> #<User id: nil, email: "[email protected]", encrypted_password: "$2a$04$z.UVWka/mRKCK6hp33LOuuBHaL8S7h1LnmWbonMfBkd...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, created_at: "2015-10-26 23:15:30", updated_at: "2015-10-26 23:15:30", first_name: "Adrien", confirmation_token: nil, confirmed_at: "2015-10-26 23:15:27", confirmation_sent_at: nil, unconfirmed_email: nil, invitation_relation: "repellat", avatar: nil, invitation_token: nil, invitation_created_at: nil, invitation_sent_at: nil, invitation_accepted_at: nil, invitation_limit: nil, invited_by_id: nil, invited_by_type: nil, invitations_count: 0, bio: "Rerum sunt ratione labore deserunt. Et quibusdam s...", last_name: "Renner", gender: 1> 
[5] pry(#<RSpec::ExampleGroups::User>)> membership 
=> #<Membership id: 126, family_tree_id: 1649, user_id: 1198, created_at: "2015-10-26 23:15:30", updated_at: "2015-10-26 23:15:30", relation: "nephew", member_id: 75, connection_sent_at: nil, connection_responded_at: nil, connect_send_limit: nil, connect_times_sent: nil, connected: nil, connect_type: nil, request_status: nil, connection_removed_at: nil> 
[6] pry(#<RSpec::ExampleGroups::User>)> u1.my_relatives 
=> [] 
[7] pry(#<RSpec::ExampleGroups::User>)> u1.family_tree 
=> #<FamilyTree id: nil, name: "Ms. Milan Goldner", user_id: 1197, created_at: "2015-10-26 23:15:30", updated_at: "2015-10-26 23:15:30"> 
[8] pry(#<RSpec::ExampleGroups::User>)> u1.family_tree.memberships 
=> [] 
[9] pry(#<RSpec::ExampleGroups::User>)> u1.memberships 
=> [] 
[11] pry(#<RSpec::ExampleGroups::User>)> membership 
=> #<Membership id: 126, family_tree_id: 1649, user_id: 1198, created_at: "2015-10-26 23:15:30", updated_at: "2015-10-26 23:15:30", relation: "nephew", member_id: 75, connection_sent_at: nil, connection_responded_at: nil, connect_send_limit: nil, connect_times_sent: nil, connected: nil, connect_type: nil, request_status: nil, connection_removed_at: nil> 
[12] pry(#<RSpec::ExampleGroups::User>)> membership.family_tree 
=> #<FamilyTree id: nil, name: "Ms. Milan Goldner", user_id: 1197, created_at: "2015-10-26 23:15:30", updated_at: "2015-10-26 23:15:30"> 

因此,即使局部變量membership與正確userfamily_tree記錄正確分配,即,當我嘗試從用戶的角度訪問它 - 即u1它返回一個空數組。

我認爲這與我的u1對象上的family_tree記錄爲nil這一事實有關。不知道如何處理,但。

回答

1

我覺得你不需要使用through: :family_tree, dependent: :destroy

用戶 has_one :family_tree, dependent: :destroy has_many :memberships, through: :family_tree, dependent: :destroy

因爲有用戶和會員之間的直接關係,因爲你的會員有belongs_to :user

會員 belongs_to :family_tree belongs_to :user belongs_to :member

當你在做u2.memberships.where(relation: relation).pluck(:relation)時,你的測試正在生成[]數組,因爲沒有爲第二個用戶創建家族樹。

+0

感謝這些觀點。你是對的。這解決了它! – marcamillion

相關問題