3

Railsチュートリアル(http://railstutorial.org/chapters/beginning、Rails 3バージョン)に従っていて、Factory GirlとRspecを使用しているときに第11章で停止しましたが、合格していないテストがあります何か間違ったことをしているように感じますが、何がわかりません。
まず第一に、そのテストに合格しないコードを含むgitリポジトリがGithubにあります。 http://github.com/Monomachus/ch3_static_pages

だから私はユーザーモデルを手に入れました

class User < ActiveRecord::Base
  attr_accessor :password
  attr_accessible :name, :email, :password, :password_confirmation

  has_many :microposts
  .
  .
  .


マイクロポストモデルを入手しました

class Micropost < ActiveRecord::Base
  attr_accessible :content

  belongs_to :user

  default_scope :order => 'microposts.created_at DESC'
end

それから私はファクトリーガールの設定を取得しました

Factory.define :user do |user|
  user.name                  "Michael Hartl"
  user.email                 "mhartl@example.com"
  user.password              "foobar"
  user.password_confirmation "foobar"
end

Factory.define :micropost do |micropost|
  micropost.content "Foo bar"
  micropost.association :user
end

そして最後にRspecコード

require 'spec_helper'

describe Micropost do
    .
    . 
  describe "microposts associations" do

    before(:each) do
      @user = User.create(@attr)
      @mp1 = Factory(:micropost, :user => @user, :created_at => 1.day.ago)
      @mp2 = Factory(:micropost, :user => @user, :created_at => 1.hour.ago)
    end

    it "should have a microposts attribute" do
      @user.should respond_to(:microposts)
    end

    it "should be in the reverse order of appearing" do
      @user.microposts.should == [@mp2, @mp1]
    end
  end
end

そして、私は間違いなく私が何か間違ったことをしていることを私に告げるエラーを受け取りました。

Failures:

  1) Micropost microposts associations should be in the reverse order of appearing
     Failure/Error: @user.microposts.should == [@mp2, @mp1]
     expected: [#<Micropost id: 2, content: "Foo bar", user_id: nil, created_at: "2010-12-24 12:47:02", update
d_at: "2010-12-24 13:47:02">, #<Micropost id: 1, content: "Foo bar", user_id: nil, created_at: "2010-12-23 13:
47:02", updated_at: "2010-12-24 13:47:02">],
          got: [] (using ==)
     Diff:
     @@ -1,3 +1,2 @@
     -[#<Micropost id: 2, content: "Foo bar", user_id: nil, created_at: "2010-12-24 12:47:02", updated_at: "20
10-12-24 13:47:02">,
     - #<Micropost id: 1, content: "Foo bar", user_id: nil, created_at: "2010-12-23 13:47:02", updated_at: "20
10-12-24 13:47:02">]
     +[]
     # ./spec/models/micropost_spec.rb:42:in `block (3 levels) in <top (required)>'

ご覧のとおり、user_idプロパティでさえ正しく設定されていません+
明らかに@user.micropostsには要素がありません。
この問題のおかげで私を助けてください

4

3 に答える 3

2

答えは簡単でした:)マイクロポストの仕様にマイクロポストの関連付けを含めました。

そして明らかに

describe "microposts associations" do

  before(:each) do
    @user = User.create(@attr)
    @mp1 = Factory(:micropost, :user => @user, :created_at => 1.day.ago)
    @mp2 = Factory(:micropost, :user => @user, :created_at => 1.hour.ago)
  end

  it "should have a microposts attribute" do
    @user.should respond_to(:microposts)
  end

  it "should be in the reverse order of appearing" do
    @user.microposts.should == [@mp2, @mp1]
  end
end

@attrにはユーザープロパティは含まれていませんでしたが、micropostプロパティ、そしてもちろん@user = nilであり、すべてが理にかなっています。したがって、同じ問題が発生する場合は、このコードをユーザー仕様に含めてください。これで、すべてのテストに合格しました:)

于 2010-12-24T14:54:44.210 に答える
1

ページネーションの章を終えるまでに、チュートリアルではFakerを使用して100人のサンプルユーザーを作成していました(390ページに10.25をリスト)。RubyMineでは、プログラムが重複するユーザーの電子メールで例外をスローしたため、テストが失敗することがわかりました。アドレス(一意の制約があります)。user_spec.rbの8行目の@attrには:email => "user@example.com"がありますが、これは重複した電子メールであるため、例外がスローされます(Fakerがすでに作成しているためだと思います)。

私の場合、修正は8行目から@attrをコピーして、describe "micropostassociations"ブロック(user_spec.rb)に貼り付け、電子メールアドレスを:email=>"user@example999.com"に変更することでした。これは完全なハックだと確信していますが、私はn00bです。

アップデート:

私にとってのもう1つの修正は、@ user = User.create(@attr)という行をコメントアウトし、@mp1と@mp2を作成することでした。

于 2011-09-02T00:26:16.350 に答える
0

user_spec.rbにすでに「マイクロポストの関連付け」があったにもかかわらず、このセクションでもテストが失敗していました。factorys.rbの新しい「micropost」ファクトリを使用できるようにするには、sporkを再起動して自動テストする必要がありました。

于 2011-08-31T00:05:42.070 に答える