7

이 테스트가 올바르게 작동하는지 확실히 확인하십시오. has_many : relationships에서 종속 : : destroy 옵션을 제거하고 user.rb에서 has_many : reverse_relationships를 제거하여 오류가 발생했습니다.종속성 테스트 추가 : 관계 모델 (11 장, 연습 1 레일 튜토리얼, 2 차 Ed)

내가 (이 게시물의 하단 참조) 다른 몇 가지 질문이 연습에서 발생한 Michael Hartl's Rails Tutorial 2nd Edition, Chapter 11 Exercises.

을 통해 노력하고 있습니다 경우 누군가에 무슨 짓을 공유하고 싶었다. 누군가가 도울 수 있다면, 좋을 것입니다.

11 장, 연습 1 :

의존에 대한 테스트를 추가 : 관계 모델에서 파괴는 (11.4 목록 및 11.16 목록) 10.15 목록의 예에 따라. 여기

내 테스트입니다 : 사양/모델/user_spec.rb

require 'spec_helper' 

describe User do 

    before do 
    @user = User.new(name: "Example User", email: "[email protected]", 
        password: "foobar", password_confirmation: "foobar") 
    end 

    subject { @user } 

    [...code omitted...] 

    describe "relationship associations" do 
    let(:other_user) { FactoryGirl.create(:user) } 
    before do 
     @user.save 
     @user.follow!(other_user) 
     other_user.follow!(@user) 
    end 

    it "should destroy associated relationships" do 
     relationships = @user.relationships 
     @user.destroy 
     relationships.should be_empty 
    end 

    it "should destroy associated reverse relationships" do 
     reverse_relationships = @user.reverse_relationships 
     @user.destroy 
     reverse_relationships.should be_empty 
    end 
    end 

질문이 연습에서 발생한 몇 :

질문 1 :

내 초기 테스트는 relationships.shou였습니다. ld be_nil reverse_relationships.should be_nil

그러나 사용자가 존재하지 않아도 배열이 여전히 반환되고 있음을 알았습니다. 그래서 사용자가 존재하지 않고 연관 메소드가 호출되면 결과는 여전히 배열입니까? 항상 사실입니까?

질문 2 : 나는 레일 콘솔에서 사용자에 대한 관계와 reverse_relationships을 삭제 놀러 싶어

.

나는이

> user = User.first 
> user.relationships 
# returns a bunch of relationships 
> user.relationships.destroy 
=> [] 
> user.relationships 
# returns same bunch of relationships 

어떻게 실제로 영구적으로 관계를 파괴 할 시도? 콘솔에서 탐색 할 때 알아두면 좋은 것 같습니다.

감사합니다. 나는 여전히 Rails에 꽤 익숙하지 않다.

답변

3

나는 루비/레일스 놈이다.

질문 1 : 은 has_many에 대한 rubyonrails.org를 검색하며

가 연관된 모든 오브젝트의 배열을 돌려줍니다 말했다. 아무것도 발견되지 않는 경우는 하늘의 배열이 리턴됩니다.

relationships.present?.should be_false 

질문 2 : user.relationships.destroy 필요합니다

보조 노트에

, 당신은 전무 빈 모두 테스트 할 수 있습니다 ID

user.relationships.destroy '1' 
+0

감사처럼 SMT해야 할 수 있습니다! –

0

감사를 사용하여 코드를 게시 너의 질문. 나는 이것을 대답이 아닌 주석으로 게시하고 싶었지만 아직 할 수없는 것 같습니다. 어쨌든, 난 그냥 작은 잠재 후보를 테스트에 추가하고 싶지만 other_user의 관점에서. 이 테스트는 follow/unfollow 테스트와 유사하므로 너무 복잡하지는 않으므로 relationships을 직접 테스트하고 followed_usersfollowers을 테스트하지 마십시오.

describe "relationship associations" do 
    ... 
    context "when a follower/followed user is destroyed" do 
    subject { other_user } 

    before { user.destroy } 

    its(:relationships) { should_not include(user) } 
    its(:reverse_relationships) { should_not include(user) } 
    end 
end 
0

Ruby on Rails Tutorial 2nd Edition.

운동 11.5.1는 특정 사용자와 관련된 관계를 파괴하기위한 테스트를 추가합니다.

이 코드는 저에게 적합합니다. 나는 Listing 10.15 예제를 따르려고 노력했다.

사양/모델/user_spec.rb

require 'spec_helper' 

describe User do 

    before do 
    @user = User.new(name: "Example User", email: "[email protected]", password: "foobar", password_confirmation: "foobar") 
    end 

    subject { @user } 
    . 
    . 
    . 
    . 
    describe "user relationships associations" do 
    let (:other_user) { FactoryGirl.create(:user) } 
    let (:another_user) { FactoryGirl.create(:user) } 

    before do 
     @user.save 
     @user.follow!(other_user) 
     @user.follow!(another_user) 
     other_user.follow!(@user) 
     other_user.follow!(another_user) 
     another_user.follow!(@user) 
     another_user.follow!(other_user) 
    end 

    its(:followed_users) { should include(other_user) } 
    its(:followers) { should include(another_user) } 

    it "should destroy associated followers" do 
     followers = @user.followers 
     @user.destroy 
     followers.each do |follower| 
     follower.followed_users.should_not include(@user) 
     end 
    end 

    it "should destroy associated followed users" do 
     followed_users = @user.followed_users 
     @user.destroy 
     followed_users.each do |followed_user| 
     followed_user.followers.should_not include(@user) 
     end 
    end 
    end 
end 
0

재 : 자신이 (가) 항상 false해야합니다 포함 바울, 관계의 배열은, 사용자가 구성되지 않으므로 테스트 항상 녹색. 다시 말하지만, follow_users 및 followers 메서드는 존재하지 않는 사용자를 반환하지 않습니다. 관계를 참조하는 관계가 남아있는 경우에도 마찬가지입니다. 따라서이 테스트는 절대로 빨간색이 아닙니다.

다른 솔루션 :

describe "relationships" do 
    let(:other_user) { FactoryGirl.create(:user) } 
    before do 
     @user.save 
     @user.follow!(other_user) 
    end 

    let(:relationship) { @user.relationships.last } 

    describe "should be destroyed when the followed user is destroyed" do 
     before { other_user.destroy } 
     its(:relationships) { should_not include(relationship) } 
    end 

    describe "should be destroyed when the following user is destroyed" do 
     subject { other_user } 
     before { @user.destroy } 
     its(:reverse_relationships) { should_not include(relationship) } 
    end 
    end 
0

위의 답변이 작동,하지만 난 그것을 짧다 광산을 공유 할 그림 .. : D

describe "following" do 

    let(:other_user) { FactoryGirl.create(:user) } 
    before do 
    @user.save 
    @user.follow!(other_user) 
    other_user.follow!(@user) 
    end 

    it { should be_following(other_user) } 
    its(:followed_users) { should include(other_user) } 

    it "should destroy associated followed_users and followers" do 
    @user.destroy 
    @user.relationships.present?.should be_false 
    @user.reverse_relationships.present?.should be_false 

    expect(other_user.followers).not_to include(@user) 
    expect(other_user.followed_users).not_to include(@user) 
    end 
    . 
    . 
    . 
    . 
end 
end 

PS 당신은 생략 할 수 있습니다

@user.relationships.present?.should be_false 
@user.reverse_relationships.present?.should be_false 

하지만 모든 관련 파괴 행동이 진행되고 있는지 확인하고 싶은 사람을 위해 그 자리에 던졌습니다.

3

당신이 당신의 도움 에릭이

it { should have_many(:relationships).dependent(:destroy) }