2

投稿モデルに非常に単純なカウンターを追加しました。誰かが投稿を開くたびに、対応するフィールド:counterが1ずつ更新されます。

  def show
    @story = Story.find(params[:id])
    @comment = @story.comments.build
    @comments = @story.comments.arrange(order: :created_at)

    @story.increment!(:counter) # ---Here---

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @story }
    end
  end

実際、私はDBをチェックしましたが、これは機能しています。しかし、私のテストは失敗します:

it "raise the counter by one when visiting a page" do
  story = FactoryGirl.create(:story)
  expect {
    visit story_url(story)
    }.to change { story.counter }.by(1)
end

そしてそれは示しています:

1) Stories raise the counter by one when visiting a page
  Failure/Error: expect {
    result should have been changed by 1, but was changed by 0
    # ./spec/requests/stories_spec.rb:8:in `block (2 levels) in <top (required) >'

これが私のtest.logです:

Started POST "/stories" for 127.0.0.1 at 2012-09-22 11:31:32 +0330
Processing by StoriesController#create as HTML
  Parameters: {"utf8"=>"✓", "story"=>{"title"=>"sfomqd8s2r", "content"=>"Beatae voluptatibus quia cumque voluptate. Beatae sed aut sit. Fugiat deleniti et vitae accusantium blanditiis. Consequatur at itaque temporibus autem. Quo beatae delectus minus porro et.", "tag_names"=>""}, "commit"=>"submit"}
   (0.1ms)  SELECT MIN("tags"."stories_count") AS min_id FROM "tags" 
   (0.1ms)  SELECT MAX("tags"."stories_count") AS max_id FROM "tags" 
  Tag Load (0.1ms)  SELECT name, stories_count FROM "tags" ORDER BY name asc
   (0.1ms)  SAVEPOINT active_record_1
  SQL (1.5ms)  INSERT INTO "stories" ("comments_count", "content", "counter", "created_at", "publish_date", "slug", "title", "updated_at", "user_id") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)  [["comments_count", 0], ["content", "Beatae voluptatibus quia cumque voluptate. Beatae sed aut sit. Fugiat deleniti et vitae accusantium blanditiis. Consequatur at itaque temporibus autem. Quo beatae delectus minus porro et."], ["counter", 0], ["created_at", Sat, 22 Sep 2012 11:31:32 IRST +03:30], ["publish_date", nil], ["slug", nil], ["title", "sfomqd8s2r"], ["updated_at", Sat, 22 Sep 2012 11:31:32 IRST +03:30], ["user_id", nil]]
   (0.1ms)  RELEASE SAVEPOINT active_record_1
Redirected to http://www.example.com/stories/2
Completed 302 Found in 18ms (ActiveRecord: 1.9ms)


Started GET "/stories/2" for 127.0.0.1 at 2012-09-22 11:31:32 +0330
Processing by StoriesController#show as HTML
  Parameters: {"id"=>"2"}
   (0.1ms)  SELECT MIN("tags"."stories_count") AS min_id FROM "tags" 
   (0.1ms)  SELECT MAX("tags"."stories_count") AS max_id FROM "tags" 
  Tag Load (0.1ms)  SELECT name, stories_count FROM "tags" ORDER BY name asc
  Story Load (0.1ms)  SELECT "stories".* FROM "stories" WHERE "stories"."id" = ? LIMIT 1  [["id", "2"]]
  CACHE (0.0ms)  SELECT "stories".* FROM "stories" WHERE "stories"."id" = ? LIMIT 1  [["id", "2"]]
  Comment Load (0.2ms)  SELECT "comments".* FROM "comments" WHERE "comments"."story_id" = 2 ORDER BY (case when comments.ancestry is null then 0 else 1 end), comments.ancestry, created_at
  SQL (0.3ms)  UPDATE "stories" SET "counter" = 1 WHERE "stories"."id" = 2
  Tag Load (0.2ms)  SELECT "tags".* FROM "tags" INNER JOIN "taggings" ON "tags"."id" = "taggings"."tag_id" WHERE "taggings"."story_id" = 2
  Rendered stories/_story_operation.html.erb (3.5ms)
  Rendered stories/_story.html.erb (5.4ms)
  Rendered comments/_form.html.erb (7.1ms)
Completed 200 OK in 34ms (Views: 18.1ms | ActiveRecord: 1.1ms | Solr: 0.0ms)
   (0.7ms)  rollback transaction

何が起こっているのか理解できません。多分それはカピバラまたは私がテストを書いた方法についての何かです。

4

1 に答える 1

2

あなたが知っているように、

expect {
  visit story_url(story)
}.to change { story.counter }.by(1)

story.counterブロック実行前後の値を比較します。コントローラーがストーリーを読み込んで変更するとき、それは完全に別の Ruby オブジェクト (たまたまデータベース内の同じ行を参照する) です:story仕様コード内のオブジェクトは、データベースに加えられた変更を認識せず、同じ (現在は古い) データ。

仕様に合格するには、代わりにstory.reload.counter変更されているかどうかを確認できます。

于 2012-09-22T08:30:16.297 に答える