2016-03-27 17 views
0

Sorunumun çözülmesi oldukça kolay olduğundan eminim. Ancak, onu nasıl ve nerede çözeceğimi bulamıyorum. Şu anda Kullanıcı modelimde #follow yöntemini test etmeye çalışıyorum. İşteRspec & FactoryGirl 'Ebeveyn kaydedilmeden oluşturulamıyor'

describe "#follow & #following?" do 
before(:each) do 
    @other_user = FactoryGirl.create(:user) 
end 

it "returns false for user following other_user" do 
    expect(@user.following?(@other_user)).to eq(false) 
end 

it "returns true for user following other_user" do 
    @user.follow(@other_user) 
    expect(@user.following?(@other_user)).to eq(true) 
end 
end 

#follow yöntem olup:

def follow(other_user) 
active_relationships.create(followed_id: other_user.id) 
end 

iade edilen hata You cannot call create unless the parent is saved İşte ben testtir. Açıkçası burada söz konusu olan ebeveyn @other_user. Şimdi ilk test amaçlanan şekilde geçiyor çünkü biz #follow yöntemini çalıştırdığımızda olduğu gibi yaratılan bir yöntem çalıştırmıyoruz. Sorum şu: Bu @other_user'u nasıl kaydedersem, böylece bir active_relationship oluşturabilirim. İşte

@user takdim ediliyor nasıl: Ayrıca

before { @user = FactoryGirl.build(:user) } 
subject { @user } 

, @user tüm diğer testler ile çalışıyor. .persisted?'u @user & @other_user üzerinde çalıştırırken, true'u alırım. @spickermann'ın belirttiği gibi,

+1

ve nasıl 'user' yaratılıyor @? –

+1

Gerçekten de '@ other_user' kaydedilmemiş mi? Tahminim, @ kullanıcısı kaydedilmeyecek. Bunu test etmek için her ikisinde de "devam ettir" mi? Ayrıca, her iki durumda da 'hataları 'olarak adlandırmak isteyebilirsiniz, belki de fabrika geçerli örnekler vermez. – spickermann

+1

'FactoryGirl.build (: user)' bir unlu kullanıcı döndürdüğünden, 'user.persisted?' 'True' döndürdüğünden şüphe duyuyor ... Lütfen @ @ user.save' önce @ user.follow (@other_user) ekleyin 've bunun örneğini geçelim diye bir test yapalım ... – spickermann

cevap

3

Sen @user için Spickermann ve Ben Y

sayesinde kaydedilmez. Özel örneklemi çalıştırmadan önce, spesifikasyonlarınızı @user kaydetmek için değiştirin.

böyle özelliklerini yazarsınız: Spec dosyasında

subject(:user) { FactoryGirl.build(:user) } 

describe "#follow & #following?" do 
    let(:other) { FactoryGirl.create(:user) } 

    it "returns false for user following other_user" do 
    expect(user.following?(other)).to be_false 
    end 

    context "when following" do 
    before do 
     user.save 
     user.follow(other) 
    end 

    it "returns true for user following other_user" do 
     expect(user.following?(other)).to be_true 
    end 
    end 
end 
0

. Söz konusu asıl ebeveyn @user ve @other_user DEĞİLDİR. Ben sadece building kullanıcı olduğum için, kullanıcı kaydedilmemiş bir nesne döndürüyordu. Böylece, henüz kaydedilmemiş bir nesne üzerinde active_relationship oluşturmamıza izin vermiyor. build'un create'a değiştirilmesi sorunu çözdü. Factory.build(:user) döner kaydedilmemiş kayıtları nedeniyle katılımları