1

Rails でブログを開発していますが、投稿を作成日の降順で表示するために Post モデルに追加したデフォルトのスコープをテストしようとしたときに行き詰まりました。

郵便番号:

class Post < ActiveRecord::Base
  attr_accessible :content, :name, :title

  validates :title, presence: true,uniqueness: true
  validates :name, presence: true
  validates :content, presence: true

  default_scope order: "posts.created_at DESC"

end

Rspec コード:

  describe "Posts descending order of creation date" do
    let(:older_post) do
    FactoryGirl.create(:post, created_at: 1.day.ago)
    end   
    let(:newer_post) do 
    FactoryGirl.create(:post, created_at: 1.hour.ago)
    end

    it "should have the 2 posts in desc order" do
    Post.all.should == [newer_post, older_post]

    end    
  end

FactoryGirlの定義

FactoryGirl.define do
    factory :post do
    sequence(:title) { |n| "A book #{n}" }
    name  "Johnny"
    content "Lorem Ipsum"
    end    
end   

出力.....F...

失敗:

    1) Post Posts descending order of creation date should have the 2 posts in desc order
    Failure/Error: Post.all.should == [newer_post, older_post]
       expected: [#<Post id: 1, name: "Johnny", title: "A book 1", content: "Lorem Ipsum", created_at: "2013-05-01 14:44:45", updated_at: "2013-05-01 15:44:45">, #<Post id: 2, name: "Johnny", title: "A book 2", content: "Lorem Ipsum", created_at: "2013-04-30 15:44:45", updated_at: "2013-05-01 15:44:45">]
        got: [] (using ==)
   Diff:
   @@ -1,3 +1,2 @@
   -[#<Post id: 1, name: "Johnny", title: "A book 1", content: "Lorem Ipsum", created_at: "2013-05-01 14:44:45", updated_at: "2013-05-01 15:44:45">,
   - #<Post id: 2, name: "Johnny", title: "A book 2", content: "Lorem Ipsum", created_at: "2013-04-30 15:44:45", updated_at: "2013-05-01 15:44:45">]
   +[]

 # ./spec/models/post_spec.rb:54:in `block (3 levels) in <top (required)>'

1.03 秒で終了 9 例、1 失敗

失敗した例:

    rspec ./spec/models/post_spec.rb:53 # Post Posts descending order of creation date should have the 2 posts in desc order

また、Rails コンソールで Post.all と入力すると、レコードが降順で取得されることにも言及したいと思います (したがって、必要に応じて)。

問題が何であるかについて、誰かが私に提案をしてもらえますか?

4

1 に答える 1

1

letRSpec では遅延評価されることを知っておいてください。これは、順序付けが関係するようなシナリオで問題を引き起こすことがよくあります。次の 2 つの方法を試してください。

  describe "Posts descending order of creation date" do
    let!(:older_post) do
    FactoryGirl.create(:post, created_at: 1.day.ago)
    end   
    let!(:newer_post) do 
    FactoryGirl.create(:post, created_at: 1.hour.ago)
    end

    it "should have the 2 posts in desc order" do
    Post.all.should == [newer_post, older_post]
    end    
  end

let!の代わりに を使用することに注意してくださいlet
または、次のように使用beforeします。

  describe "Posts descending order of creation date" do

    it "should have the 2 posts in desc order" do
    @older_post = FactoryGirl.create(:post, created_at: 1.day.ago)
    @newer_post = FactoryGirl.create(:post, created_at: 1.hour.ago)

    Post.all.should == [@newer_post, @older_post]
    end    
  end

うまくいくかどうか教えてください。:)

于 2013-05-01T15:56:29.850 に答える