Rails 4 minitest因更新操作失败

时间:2014-10-26 09:44:32

标签: ruby ruby-on-rails-4 minitest

我使用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

为什么会这样?

1 个答案:

答案 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。