当我尝试将对象保存到数据库时,为什么Rails函数测试失败

时间:2012-06-15 17:28:39

标签: ruby-on-rails ruby-on-rails-3 testing functional-testing

我正在尝试测试我的show动作,但我首先必须将对象保存到数据库才能显示。

test "should get show" do
  post :create, question: { question: 'apple'}
  get :show, {'id' => "1"}
  assert_response :success
  assert_not_nil assigns(:question)
end

在另一个测试中,我有post :create...行并且它有效。但是,我一直在ActiveRecord::RecordNotFound: Couldn't find Question with id=1,所以我不确定问题是什么。我该如何解决?大图是什么最好的方法呢?

修改:

我将测试改为:

test "should get show" do
    post :create, question: {set_id: 4}
    pp Question.all
    get :show, {'id' => "1"}
    assert_response :success
    assert_not_nil assigns(:question)
end

这给了我:

[#<Question id: 261990764, question: "Who was... updated_at: "2012-06-15 19:34:16">,
 #<Question id: 607888892, question: "Who was... updated_at: "2012-06-15 19:34:16">,
 #<Question id: 607888893, question: nil, ... set_id: 4,...]

除了ID部分之外,您会期望这是什么。 rails是否在测试环境中分配随机ID?

这是我的通过测试:

test "should get show" do
  q = Question.new(question: 'q', answer: 'a', set_id: 1)
  q.save
  get :show, {id: q.id}
  assert_response :success
  assert_not_nil assigns(:question)
end

仍然希望有人向我解释为什么ID如此之高以及rails如何分配它。

而且,这是一个利用灯具的例子:

test "should get show2" do
    get :show, {id: questions(:prez_one).id}
    assert_response :success
    assert_not_nil assigns(:question)
end

1 个答案:

答案 0 :(得分:1)

您是否检查过您创建的问题是否为id = 1? id列是否在db中自动递增? 你在使用MySQL db吗?

您可能希望在post :create行之后显示所有问题 然后,选择带有苹果的问题以获得相应的ID。

希望有所帮助。