Rails单元测试 - 无法重定向到nil!

时间:2010-10-31 15:12:35

标签: ruby-on-rails unit-testing

联系人has_many notes;笔记属于联系人。在我的笔记控制器中,成功保存笔记后,我使用以下方法重定向到笔记的联系人:

format.html { redirect_to(@note.contact, :notice => 'Note was successfully created.') }

在我的单元测试中,我正在测试创建注释并重定向到注释的联系人视图页面的能力。我的notes.yml fixture只是设置音符,在notes_controller_test.rb的设置部分,我将灯具中的音符分配给@note。

这是实际的测试代码:

test "should create note" do
  assert_difference('Note.count') do
    post :create, :note => @note.attributes
  end
end

我认为该笔记已成功保存,但重定向失败。所以看起来控制器中的redirect_to会抛出“无法重定向到nil!”错误,但我似乎无法理解为什么。

这是我的Notes创建操作:

def create
@note = Note.new(params[:note])

respond_to do |format|
  if @note.save
    format.html { redirect_to(@note.contact, :notice => 'Note was successfully created.') }
    format.xml  { render :xml => @note.contact, :status => :created, :location => @note.contact }
  else
    format.html { render :action => "new" }
    format.xml  { render :xml => @note.contact.errors, :status => :unprocessable_entity }
  end
end

2 个答案:

答案 0 :(得分:2)

看来你的灯具没有在@note上创建和/或加载联系人。抛出'redirect to nil'是因为@ note.contact返回nil。确保注释的contact_id有效,并且在测试运行之前,该注释是从db及其联系人加载的。

答案 1 :(得分:0)

当我添加我的联系人时,我在声明值时没有指定ID。我只想说:

one:
  firstname: John
  lastname: doe

我在夹具中添加了一个id字段,测试通过了。甜! :)感谢您指出我正确的方向。看起来好像你没有指定一个特定的ID,然后它会给它一个疯狂的长随机ID(见于test.log)。

有没有办法给它一个ID,将它与音符夹具连接而不用硬编码那里的数字?

one:
  firstname: John
  lastname: doe

然后在我的笔记夹具中:

one:
  body: This is a note text.
  contact_id: <%= contacts(:one).id %>

那会有用吗?