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

时间:2016-06-24 13:30:29

标签: ruby-on-rails database testing activerecord rspec

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

2 个答案:

答案 0 :(得分:1)

您实际上正在接收创建的文章记录。查看测试输出的最后一行。它说“预期#ActiveRecord ......”,这意味着它返回了一个Article对象,但它应该不会返回任何内容(nil)。

测试代码的问题是您的断言行。 assert_nil是在这种情况下使用的错误方法。

尝试类似:

$rowpost='';
if(isset($_POST['rowpost'])){
$rowpost  = $_POST['rowpost'];
$rowpost  = implode(' ', $rowpost);
  if(mysql_query("UPDATE prodotti SET vetrina='$rowpost' WHERE id='$_GET['id']'")){
    echo 'rowpost';
  }
}
if(isset($_POST['addrowname'])){
$filename = "showcase.txt";
$contents = file_get_contents($filename);
$newcontent = $contents.' '.$_POST['addrowname'];
fwrite(fopen($filename, 'w'), $newcontent);
if(isset($_POST['chkaddshcs'])){
  $rowpost  = $_POST['addrowname'].' '.$rowpost;
  if(mysql_query("UPDATE prodotti SET vetrina='".$rowpost."' WHERE id='".$_GET['id']."'")){
    echo 'chkaddshcs';
  }
}

答案 1 :(得分:1)

只需查看您的代码和测试。

您进行了GET#create来电,确实创建了一个标题为&#39; abc&#39;的文章对象。

然后在您的测试中,您调用此操作,这将创建带有&#39; abc&#39;作为标题,然后做这个断言:

 assert_nil Article.where(title: "abc"), "Article nil"

哪个失败了,它应该是,因为有一篇文章&#39; abc&#39;作为标题(你刚刚在你的控制器中创建它)。

你正在做的是错误的断言。你不想断言你的文章,你想确保他在那里,因此不是

类似的东西:

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

除了这个问题,如果找不到文章,Article.where将不会返回nil。它将为您提供一个空的ActiveRecord :: Relation(#<ActiveRecord::Relation []>