2016-04-10 25 views
1

numaralı telefondan ulaşabilirsiniz. Kendimi şu bağlantıdan, http://railscasts.com/episodes/163-self-referential-association'den ilham aldım, ancak rspec testi kolay gelmiyor.RSpec takipçileri/arkadaşlık testleri ile kullanıcılara birçok

kullanıcı modeli:

class User < ActiveRecord::Base 

    # Associations 
    has_many :followerships 
    has_many :followers, :through => :followerships 
    has_many :inverse_followerships, :class_name => "Followership", :foreign_key => "follower_id" 
    has_many :inverse_followers, :through => :inverse_followerships, :source => :user 
end 

izleyiciliğin modeli:

class Followership < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :follower, :class_name => "User" 
end 

followerhip fabrika:

FactoryGirl.define do 
    factory :followership do 
    user_id 1 
    follower_id 1 
    end 
end 

followerships kontrolörü:

class FollowershipsController < InheritedResources::Base 
    def create 
    @followership = current_user.followerships.build(:follower_id => params[:follower_id]) 
    if @followership.save 
     flash[:notice] = "Following." 
     redirect_to root_url 
    else 
     flash[:error] = "Unable to follow." 
     redirect_to root_url 
    end 
    end 

    def destroy 
    @followership = current_user.followerships.find(params[:id]) 
    @followership.destroy 
    flash[:notice] = "Removed followership." 
    redirect_to current_user 
    end 
end 

folowerships kontrolör Spec (bu tamamen yanlış):

require 'rails_helper' 

describe FollowershipsController do 
    let!(:followership) { create(:followership) } 
    let!(:follower) { followership.follower } 
    let!(:user) { create(:user) } 

    before do 
    sign_in :user, user 
    end 

    describe "#create" do 
    it "saves the followership" do 
     post :create, followership: { follower_id: follower } 

     expect(response).to redirect_to(root_path) 
     expect(assigns(:followership).followership.followers).to eq(user) 
     expect(flash[:notice]).to eq("Following.") 
    end 

    it "fails to save followership" do 
     expect(post :create, followership: { follower_id: follower }).to redirect_to(root_path) 
     expect(flash[:notice]).to eq("Unable to follow.") 
    end 
    end 

    describe "#destroy" do 
    it "deletes the followership" do 
     expect { 
     delete :destroy, id: follower 
     }.to change(Followership, :count).by(-1) 

     expect(flash[:notice]).to eq("Removed followership.") 
    end 
    end 

end 

Hata followerships gelen kontrolör RSpec yardım

FollowershipsController 
    #destroy 
    deletes the followership (FAILED - 1) 
    #create 
    saves the followership (FAILED - 2) 
    fails to save followership (FAILED - 3) 

Failures: 

    1) FollowershipsController#destroy deletes the followership 
    Failure/Error: delete :destroy, id: follower 

    ActionController::UrlGenerationError: 
     No route matches {:action=>"destroy", :controller=>"followerships", :id=>nil} 

    2) FollowershipsController#create saves the followership 
    Failure/Error: expect(assigns(:followership).followership.followers).to eq(user) 

    NoMethodError: 
     undefined method `followership' for #<Followership:0x00000109f69780> 

    3) FollowershipsController#create fails to save followership 
    Failure/Error: expect(flash[:notice]).to eq("Unable to follow.") 

     expected: "Unable to follow." 
      got: "Following." 

     (compared using ==) 

Teşekkür:)

cevap

2

let komutu, tembel değerlendirmeyi kullanır, bu nedenle bu kayıtlar çağrılana kadar gerçekte oluşturulmaz.

class Followership < ActiveRecord::Base 
    validates_uniqueness_of :user_id, scope: :follower_id 
:
let!(:followership) { create(:followership) } 
    let!(:follower) { followership.follower } 
    let!(:user) { create(:user) } 

zaten kullanıcıların bu çifti için yoksa doğrulamalarınız da sadece aşağıdaki oluşturulmasına izin emin olun: Testlerinizi çalıştırmadan önce oluşturulduktan sağlamak için let! sözdizimini kullanın

Ayrıca, follower/followership ilişkiler mutlaka bir id ait yoktur user beri user ait olacaktır garanti değil 1.

Son olarak, assigns bir yöntemdir, bu nedenle sözdizimi assigns(:followership)assigns[:followership]

+0

selam Anthony, yorumlarınızı kabul ettim. Fabrika ve Rspec'in çalışmadığını biliyor muyum? Teşekkürler – Jony