我使用Rails 4.1.6和Ruby 2.1.3
bookmarks_controller.rb 中的 更新 方法def update
service = UpdateBookmark.new(params[:id], params[:bookmark])
if service.update
head 204
else
head 422
end
end
这是 app / services 目录下的 UpdateBookmark 课程:
class UpdateBookmark
attr_reader :bookmark
def initialize id, data
@id = id
@data = data
end
def update
begin
@bookmark = Bookmark.find @id
@bookmark.update_attributes @data
rescue
false
end
end
end
我使用minitest进行测试,这是我的 bookmarks_controller_test.rb
test "returns ok if a record is updated" do
bookmark = Bookmark.create! ({ title: "Tuts+", url: "http://tutsplus.com" })
put :update, id: bookmark.id, bookmark: { title: "Net Tuts" }
assert_response 204
end
这是我在test / services目录下的 update_bookmark_test.rb ,用于测试我的 UpdateBookmark 类
require 'test_helper'
require 'minitest/spec'
describe "UpdateBookmark" do
it "updates a bookmark" do
bookmark = Bookmark.create! title: "Tuts+", url: "http://tutsplus.com"
service = UpdateBookmark.new(bookmark.id, {
title: "Net Tuts",
url: "http://net.tutsplus.com"})
service.update
service.bookmark.title.must_equal "Net Tuts"
service.bookmark.url.must_equal "http://net.tutsplus.com"
end
it "fails to create a bookmark if there's no id" do
refute UpdateBookmark.new(nil, {}).update
end
end
当我运行测试时,它失败如下:
BookmarksControllerTest#test_returns_ok_if_a_record_is_updated [/home/krismp/Sites/dainty/api/test/controllers/bookmarks_controller_test.rb:21]:
Expected response to be a <204>, but was <422>.
Expected: 204
Actual: 422
为什么会这样?
答案 0 :(得分:2)
您的UpdateBookmark服务会抑制更新期间可能发生的所有异常,因此您将缺少信息。我不知道是谁告诉你发表这个begin ... rescue ... end
声明,但你应该暂时评论一下,这样你就可以看到更多关于错误的信息。
def update
#begin
@bookmark = Bookmark.find @id
@bookmark.update_attributes @data
#rescue
# false
#end
end
P.S。在Ruby中,有一个常见的约定,即使用2个空格作为缩进,而不是4。