为什么create方法不返回带id的对象?

时间:2016-04-05 16:03:34

标签: ruby rspec

我有下表TodoList:

class TodoList < ActiveRecord::Base
end

class CreateTodoLists < ActiveRecord::Migration
  def change
    create_table :todo_lists do |t|
      t.string :list_name
      t.date :list_due_date
      t.timestamps null: false
    end
  end
end

我创建了crud方法:

  def create_todolist(params)
      todolist = TodoList.create(list_name:params[:name], list_due_date: params[:due_date])
  end

我有后续测试:

     context "the code has to create_todolist method" do
        it { is_expected.to respond_to(:create_todolist) } 
        it "should create_todolist with provided parameters" do
            expect(TodoList.find_by list_name: "mylist").to be_nil
            due_date=Date.today
            assignment.create_todolist(:name=> 'mylist', :due_date=>due_date)
            testList = TodoList.find_by list_name: 'mylist'
            expect(testList.id).not_to be_nil
            expect(testList.list_name).to eq "mylist"
            expect(testList.list_due_date).to eq due_date
            expect(testList.created_at).not_to be_nil
            expect(testList.updated_at).not_to be_nil
        end  

  end

当我启动测试时,给我以下错误:

       Assignment rq03 rq03.2 assignment code has create_todolist method should create_todolist with provided parameters: 
Failure/Error: 
expect(testList.id).not_to be_nil NoMethodError: undefined method id' for nil:NilClass 
# ./spec/assignment_spec.rb:173:in block (4 levels) in <top (required)>' 
# ./spec/assignment_spec.rb:14:in `block (2 levels) in <top (required)>'

这是我的项目目录:  enter image description here

似乎创建方法不成功。有什么问题吗?

1 个答案:

答案 0 :(得分:1)

错误来自以下代码行:

    assignment.create_todolist(:name=> 'mylist', :due_date=>due_date)
    testList = TodoList.find_by list_name: 'mylist'
    expect(testList.id).not_to be_nil

在第一行中,您尝试创建记录。但是,您实际上并未检查模型是否已成功保存。如果无法保存模型,则find_by调用将返回nil。然后,当您致电testList.id时,您实际上是在nil对象上调用id方法,从而导致您的错误。

您应该在测试中放置断点并手动逐行运行以检查结果。有用的活动记录方法是valid?persisted?errors.full_messages。通过这种方式调试更容易。

您还应该练习阅读错误,因为您可以从中学到很多信息。要解决您的错误,例如:

expect(testList.id).not_to be_nil NoMethodError: undefined method id' for nil:NilClass 
# ./spec/assignment_spec.rb:173:in block (4 levels) in <top (required)>' 

因此,您可以在assignment_spec.rb的第173行看到错误。 undefined method id for nil:NilClass告诉您,您正试图在零对象上调用id。知道find_by可以产生零物体,我觉得我找到了问题所在。我在这里重复一遍,但这只是我如何思考调试问题的一个例子。