7

これらのテストが正しく機能していることを確認してください。user.rb の has_many :relationships と has_many :reverse_relationships の依存: :destroy オプションを削除して、失敗させました。

他の誰かがMichael Hartl の Rails Tutorial 2nd Edition, Chapter 11 Exercises に取り組んでいる場合に備えて、私が行ったことを共有したいと思います。

この演習からいくつかの疑問が生じました (この投稿の下部を参照)。誰かが助けてくれれば、それは素晴らしいことです。

第 11 章、演習 1:

リレーションシップ モデル (リスト 11.4 とリスト 11.16) に依存する :destroy のテストを追加するには、リスト 10.15 の例に従ってください。

これが私のテストです: spec/models/user_spec.rb

require 'spec_helper'

describe User do

  before do
  @user = User.new(name: "Example User", email: "user@example.com", 
                   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:

私の最初のテストは、relationship.should be_nil reverse_relationships.should be_nil でした。

しかし、ユーザーが存在しないにもかかわらず、配列がまだ返されていることに気付きました。では、ユーザーが存在せず、関連付けメソッドが呼び出された場合、結果は配列のままですか? これは常に真実ですか?

質問2:

Railsコンソールでユーザーのリレーションシップとreverse_relationshipsを削除してみました。

私はこれを試しました

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

実際に関係を完全に破壊するにはどうすればよいですか? コンソールで探索するときに知っておくとよいことのようです。

ありがとう!私はまだRailsにかなり慣れていません

4

6 に答える 6

3

私もルビー/レール初心者です。

質問 1: ruby​​onrails.orgを検索するhas_manyと、

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

ちなみに、nil と空の両方をテストできます。

relationships.present?.should be_false

質問 2:user.relationships.destroyには :id が必要です

user.relationships.destroy '1'
于 2012-04-24T18:23:53.167 に答える
0

RubyonRailsチュートリアル第2版。

演習11.5.1特定のユーザーに関連付けられた関係を破棄するためのテストを追加します。

このコードは私のために働きます。リスト10.15の例に従おうとしました。

spec / models / user_spec.rb

require 'spec_helper'

describe User do

  before do 
    @user = User.new(name: "Example User", email: "user@example.com", 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
于 2012-08-25T14:52:43.823 に答える
0

質問とともにコードを投稿していただきありがとうございます。これを回答ではなくコメントとして投稿したかっただけですが、まだできないようです。とにかく、私はあなたのテストに小さな潜在的な候補者を追加したかっただけですが、other_userの観点から. このテストはフォロー/フォロー解除テストに似ているので、冗長になりすぎないことを願っていますが、それらを通過するandrelationshipsではなく、直接テストします。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
于 2012-06-10T21:04:21.050 に答える
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

しかし、関連するすべての破棄アクションが機能していることを確認したい人のために、そこに入れます。

于 2013-11-18T01:52:20.320 に答える
0

再: ポール、関係配列はユーザ​​ーによって構成されていないため、彼の include() は常に false である必要があるため、テストは常に緑色です。Re: maria、 followed_users および follower メソッドは、存在しないユーザーを参照する関係が残っている場合でも、そのユーザーを返さないようです。したがって、このテストも赤になることはありません。

別の解決策:

  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
于 2013-10-12T07:43:16.267 に答える