在测试时无法从activerecord中检索保存的数据



我正在测试一个控制器。索引方法保存文章到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 []>)

相关内容

  • 没有找到相关文章

最新更新