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