使用符号引用时无法找到字段

时间:2011-07-14 13:49:10

标签: ruby-on-rails-3 rspec webrat

我第一次玩RoR并遇到了一个奇怪的错误。我的导航链接有以下测试代码:

describe "when logged in" do 
  before(:each) do
    @user = Factory(:user)
    visit login_path

    #the line below is the weird one
    fill_in "session[user_name]", :with => @user.user_name

    fill_in :password, :with => @user.password
    click_button
  end

  it "should have navigation links" do
    response.should have_selector("nav")
  end

  it "should have link to log out" do
    response.should have_selector("a", :href => logout_path, :content => "Log out")      
  end  
end

上面的代码工作得很好,但如果我要更改行

fill_in "session[user_name]", :with => @user.user_name

fill_in :user_name, :with => @user.user_name

它不起作用,我无法弄清楚为什么。我得到的错误是

Failure/Error: fill_in :user_name, :with => @user.user_name
   Webrat::NotFoundError:
   Could not find field: :user_name

相关生成的html是:

<label for="session_user_name">User name</label><br/>
<input id="session_user_name" name="session[user_name]" size="30" type="text" />
<label for="session_password">Password</label><br/>
<input id="session_password" name="session[password]" size="30" type="password" />

如果您查看代码,您会看到我为密码做了完全相同的操作,并且运行正常。我想使用导致错误的语法,所以我做错了吗?

1 个答案:

答案 0 :(得分:2)

试试这个:

fill_in "user name", :with => @user.user_name

我认为webrat很好,并且能够找到你的标签'密码',因为它不区分大小写并且将:password转换为'密码'。

您还可以使用HTML id属性,即

fill_in :session_user_name, :with => @user.user_name

这里有一个问题,如果你想改用Capybara而不是Webrat:Capybara是区分大小写的,所以它会在fill_in "user name"上失败。

我不确定这里的最佳做法是什么,但我已经切换到使用HTML idname属性而不是我自己的代码中的标签文本。这样做的原因是它不那么脆弱,因为人们改变网站上面向客户的文本比改变语义元素和名称更多。