質問

以下に、単純なRailsアプリケーションのコードをリストしました。このテストでは、投稿の updated_at フィールドはPostControllerの更新アクション内で変更されないため、以下のテストは最後の行で失敗します。なぜですか?

標準モデルのタイムスタンプがPostモデルに含まれているため、この動作は少し奇妙に思えます。ローカルサーバーのライブテストは、更新アクションから戻った後にこのフィールドが実際に更新され、最初のアサーションが満たされることを示していますしたがって、更新アクションが成功したことを示しています。

上記の意味でフィクスチャーを更新可能にするにはどうすればよいですか

# app/controllers/post_controller.rb
def update
  @post = Post.find(params[:id])
  if @post.update_attributes(params[:post])
    redirect_to @post     # Update went ok!
  else
    render :action => "edit"
  end
end

# test/functional/post_controller_test.rb
test "should update post" do
  before = Time.now
  put :update, :id => posts(:one).id, :post => { :content => "anothercontent" }
  after = Time.now

  assert_redirected_to post_path(posts(:one).id)     # ok
  assert posts(:one).updated_at.between?(before, after), "Not updated!?" # failed
end

# test/fixtures/posts.yml
one:
  content: First post
役に立ちましたか?

解決

posts(:one)

これは、「":one」という名前のフィクスチャを取得することを意味します。 posts.ymlで。これは、テスト中に変更されることはありませんが、非常に奇妙で破壊的なコードを除き、健全なテストには場所がありません。

やりたいことは、コントローラーが割り当てているオブジェクトを確認することです。

post = assigns(:post)
assert post.updated_at.between?(before, after)

他のヒント

shoulda( http://www.thoughtbot.com/を使用していた場合の補足事項projects / shoulda / )は次のようになります:

context "on PUT to :update" do
    setup do 
        @start_time = Time.now
        @post = posts(:one)
        put :update, :id => @post.id, :post => { :content => "anothercontent" } 
    end
    should_assign_to :post
    should "update the time" do
        @post.updated_at.between?(@start_time, Time.now)
    end
end

Shouldaは素晴らしい。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top