我正在测试一个控制器。索引方法保存文章到activerecord,但我不能从测试代码中获得文章。
我错过了什么?
控制器class ArticlesController < ApplicationController
def create
if Article.new(:title => "abc").save
render status: 200, json: ""
else
render status: 500, json: ""
end
end
end
测试require 'test_helper'
class ArticlesControllerTest < ActionController::TestCase
test "should get create" do
get :create
assert_response :success
assert_nil Article.where(title: "abc"), "Article nil"
end
end
我得到以下结果
F
Finished in 0.100930s, 9.9079 runs/s, 19.8157 assertions/s.
1) Failure:
ArticlesControllerTest#test_should_get_index [test/controllers/articles_controller_test.rb:7]:
Article nil.
Expected #<ActiveRecord::Relation [#<Article id: 980190963, title: "abc", created_at: "2016-06-24 13:23:36", updated_at: "2016-06-24 13:23:36">]> to be nil.
1 runs, 2 assertions, 1 failures, 0 errors, 0 skips
您实际上正在接收创建的Article记录。看看测试输出的最后一行。它说"预期#ActiveRecord…",这意味着它返回了一个Article对象,但它应该不返回任何东西(nil)。
测试代码的问题在于断言行。在这种情况下,Assert_nil是错误的方法。
试试这样写:
assert_equal "abc", Article.first.title
看看你的代码和测试。
你有一个GET#create
调用,你确实创建了一个标题为'abc'的Article对象。
然后在您的测试中,您调用这个操作,它将创建以'abc'作为标题的文章,然后执行以下断言:
assert_nil Article.where(title: "abc"), "Article nil"
失败了,它应该失败,因为有一个标题为'abc'的文章(您刚刚在控制器中创建了它)。
你所做的是错误的断言。你不希望assert_nil文章,你想确保他在那里,因此不是nil。
类似:
class ArticlesControllerTest < ActionController::TestCase
test "should get create" do
get :create
assert_response :success
refute_nil Article.where(title: "abc").first, "Article should not be nil"
end
end
撇开这个问题,文章。如果没有找到任何物品,Where不会返回nil。它会给你一个空的ActiveRecord::Relation (#<ActiveRecord::Relation []>
)