7

これらのテストが正しく機能していることを確かめてください。それは、has_many:relationshipsの依存関係::destroyオプションと、user.rbのhas_many:reverse_relationshipsを削除することで失敗に終わりました。依存関係のテストを追加する:Relationshipモデルの破壊(第11章、演習1 Railsチュートリアル、第2版)

は、私は(この記事の一番下を参照)、他のいくつかの質問には、この運動から生まれたMichael Hartl's Rails Tutorial 2nd Edition, Chapter 11 Exercises.

を通じて取り組んでいる場合、誰に何をしたか共有したいと思いました。誰かが助けることができれば、それはすばらしいでしょう。

第11章、演習1:

依存のテストを追加:10.15リストの例を以下により(11.4およびリスト11.16リスト)リレーションシップモデルで破壊します。

ここに私のテストです: 仕様/モデル/ 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

私はruby/rails noobです。

質問1: はhas_manyためrubyonrails.orgを検索し、それが

は、関連するすべてのオブジェクトの配列を返しますと言います。何も見つからない場合は、空の配列が返されます。

relationships.present?.should be_false 

質問2: user.relationships.destroy必要です。

サイドノートで

、あなたは皆無と空の両方をテストできID

user.relationships.destroy '1' 
+0

おかげのようなSMT必要かもしれません! –

0

おかげで、あなたのコードを投稿するためあなたの質問。私はこれをコメントではなく回答として投稿したかっただけですが、私はまだできません。とにかく、小さな候補候補をテストに追加したかっただけですが、other_userの視点から考えてみました。テストはフォロー/アンフォローテストと似ていますので、冗長すぎないようにしてください。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

再:ポール、彼含むように関係アレイは(ユーザによって構成されていない)は常に偽でなければならないので、テストは常に緑。 Re:maria、それを参照している関係が残っている場合でも、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) } 
関連する問題