Как сделать светильники обновляемыми в тестах Rails?
-
05-07-2019 - |
Вопрос
Ниже я перечислил некоторый код из простого приложения 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)
Это означает "получить прибор с именем": один " в posts.yml. Это никогда не изменится во время теста, за исключением какого-то чрезвычайно странного и разрушительного кода, которого нет в нормальных тестах.
Что вы хотите сделать, это проверить объект, который назначает контроллер.
post = assigns(:post)
assert post.updated_at.between?(before, after)
Другие советы
На заметку, если вы использовали musta ( 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
Должна быть классной.