3

我收到以下错误:

Capybara::ElementNotFound: Unable to find field "username"
./spec/controllers/sessions_controller_spec.rb:10:in `block (3 levels) in <top (required)>'

规格:

require 'spec_helper'

describe SessionsController do
  before :each do
    @user = FactoryGirl.create(:user)
  end
  context 'creating a new session' do
    it 'can set the current_user variable to the logged user' do
      visit '/login'
      fill_in 'username', with: 'gabrielhilal' #I have tried `Username` as well
      fill_in 'password', with: 'secret'
      click_button 'Login'
      current_user.should == @user
      current_user.username.should == 'gabrielhilal'
    end
  end
  context 'destroying existing session' do
    xit 'can destroy the current_user' do
    end
  end
end

但是我的username表单中有该字段:

<form accept-charset="UTF-8" action="/sessions" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" / <input name="authenticity_token" type="hidden" value="x7ORLDIvq1BXr8SOkd/Zla9Pl5R5tBXAtyflCpTGCtY=" /></div>
  <div class="field">
    <label for="username">Username</label>
    <input id="username" name="username" type="text" />
  </div>
  <div class="field">
    <label for="password">Password</label>
    <input id="password" name="password" type="password" />
  </div>
  <div class="actions">
    <input name="commit" type="submit" value="Login" />
  </div>
</form>

我做了一个类似的测试,cucumber它通过了,这证实了该字段username存在:When to switch from cucumber to rspec in the BDD cycle for a login procedure

任何想法?

编辑- 我添加了save_and_open_page,这给了我一个空白页。puts "#{page.html.inspect}"也返回空。

""

Capybara::ElementNotFound: Unable to find field "username"
./spec/controllers/sessions_controller_spec.rb:12:in `block (3 levels) in <top (required)>'
4

4 回答 4

10

您可以使用以下终端对其进行调试:

it {puts page.body}

并查看是否有“用户名”输入。但我认为第一步的问题visit '/login'

于 2013-08-13T10:42:43.777 回答
7

我知道你已经回答了你自己的问题(有点),但我觉得仍然有必要让你知道你提供的示例是控制器和请求规范的混合......

RSpec - Controller Specs逐字引用: Note: To encourage more isolated testing, views are not rendered by default in controller specs.

主要区别(RSpec 解释它是哪种规范的方式)是行:describe SessionsController do.

要将其与 RSpec 和测试最佳实践保持一致:

  1. 将规范移至spec/requests
  2. 将描述更改为describe "SessionsController" do
  3. 消除render_views

你的规范应该运行得很好......

查看RSpec - Request Specs了解我的意思。我还会查看betterspecs.org,了解可以改进测试的方法。

于 2013-08-13T14:38:59.160 回答
0

我意识到我必须明确告诉我的控制器渲染视图。我在rspec 自述文件中找到了它,所以我解决了添加render_views.

describe SessionsController do
  render_views #this line solved the problem
  before :each do
    user = FactoryGirl.create(:user)
  end
...
于 2013-08-13T10:50:20.767 回答
0

block_unknow_urls就我而言,只需删除features/support/env.rb

Capybara::Webkit.configure do |config|
  config.allow_unknown_urls
end
于 2020-03-23T07:42:55.697 回答