2016-04-26 3 views
0

Ich versuche, einen Spezifikationstest für die MHartl's example zu machen. Wie folgt, mein schweres ist für #Folgt einen Benutzer.Rspec (für Michael Hartl Beispiel) für die Definition der Beziehung folgenden Benutzern

class User < ActiveRecord::Base 

    # Associations 
    has_many :active_relationships, class_name: "Relationship", 
            foreign_key: "follower_id", 
            dependent: :destroy 
    has_many :following, through: :active_relationships, source: :followed 
    has_many :followers, through: :passive_relationships, source: :follower 

    # Follows a user. 
    def follow(other_user) 
    active_relationships.create(followed_id: other_user.id) 
    end 

    # Unfollows a user. 
    def unfollow(other_user) 
    active_relationships.find_by(followed_id: other_user.id).destroy 
    end 

    # Returns true if the current user is following the other user. 
    def following?(other_user) 
    following.include?(other_user) 
    end 

Für meine spec:

require 'rails_helper' 

RSpec.describe User, :type => :model do 
    let(:user) { build(:user) } 

    describe 'Validations' do 
    it 'has a valid factory' do 
     expect(user).to be_valid 
    end 

    it { should validate_presence_of(:email) } 
    it { should validate_presence_of(:password) } 
    it { should validate_confirmation_of(:password) } 
    end 


    let(:user) { create(:user) } 
    let(:other_user) { create(:user) } 

    describe '#following?' do 
    it "expect relationship between two users to be empty" do 
     expect(user.active_relationships).to be_empty 
    end 
    end 

    describe '#follow' do 
    it "creates the active relationship between two users" do 
     user.follow(other_user) 
     expect(user.active_relationships.first.followed_id).to eq(other_user.id) 
    end 

    it "creates the passive relationship between two users" do 
     user.follow(other_user) 
     expect(other_user.passive_relationships.first.follower_id).to eq(user.id) 
    end 
    end 

    describe '#unfollow' do 
    it "destroys the active relationship between two users" do 
     user.follow(other_user) 
     user.unfollow(other_user) 
     expect(user.active_relationships.find_by.followed_id).to change(Relationship, :count).by(-1) 
    end 
    end 

Meine Ausfälle:

1) User#unfollow destroys the active relationship between two users 
    Failure/Error: active_relationships.find_by(followed_id: other_user.id).destroy 

    NoMethodError: 
     undefined method `destroy' for nil:NilClass 

    2) User#follow creates the passive relationship between two users 
    Failure/Error: expect(other_user.passive_relationships.first.follower_id).to eq(user.id) 

    NoMethodError: 
     undefined method `passive_relationships' for #<User:0x0000010c4146e8> 

Wenn Sie weitere Informationen über dieses Thema benötigen, fiel bitte fragen kostenlos! und bitte sagen Sie mir, kann ich mehr über diese Spezifikationen Tests lernen. Dank für Ihre Hilfe :)

Antwort

1

Sie vermissen die :passive_relationships Beziehung im User Modell, das die :active_relationships Beziehung widerspiegelt:

has_many :passive_relationships, class_name: "Relationship", 
           foreign_key: "followed_id", 
           dependent: :destroy 
1

besser Mai dieses anderen Benutzer in let, zu erstellen und ersetzen build mit create, da Sie keine neuen nicht gespeicherte Datensatz Validierung:

let(:user) { create(:user) } 
let(:other_user) { create(:user) } 

dann

user.follow(other_user) 
+0

Hallo, ich habe gerade mit Ihrer Hilfe aktualisiert! aber ich habe den Fehler: 'Sie können nicht erstellen erstellen, wenn das Elternteil gespeichert ist – Jony

+1

@Jony aktualisierte Antwort –

+0

der Test funktioniert für' user.follow (other_user) 'aber nicht für' user.following? (other_user) .should be_valid' – Jony