找不到未禁用的字段“ player_1_name”

时间:2019-08-07 09:50:12

标签: html ruby sinatra

我只是通过演练开始了这段代码。我的功能测试应该可以正常工作,但是它给了我这个错误:

Unable to find field "player_1_name" that is not disabled

我尝试使用[]更改引号,路径,但仍然给我相同的错误。

  • 我的红宝石版本。 红宝石2.6.3p62(2019-04-16修订版67580)[x86_64-darwin18]
  • 此外,除了Rspec和水豚以外,我还在使用shot弹枪,sinatra。 在下面的代码中,我将指定每个代码是哪个文件。
#features/entre_names_spec.rp

feature "Enter names" do
  scenario "submitting names" do
    visit('/')
    fill_in "player_1_name", with: 'Dave'
    fill_in "player_2_name", with: 'Mittens'
    click_button 'Submit'
    expect(page).to have_content 'Dave vs. Mittens'
  end
end
#app.rb
require 'sinatra/base'

class Battle < Sinatra::Base
  get '/' do
    'Testing infrastructure working!'
  end

  get '/' do
    erb :index
  end

  post '/names' do
    @player_1_name = params[:player_1_name]
    @player_2_name = params[:player_2_name]
    erb :play
  end

  # start the server if ruby file executed directly
  run! if app_file == $0
end
views/index.erb
<form action= "names" method= "post">
  <input type= "text" name= "player_1_name">
  <input type= "text" name= "player_2_name">
  <input type= "submit" value= "Submit">
</form>
#views/play.erb
<%= @player_1_name %> vs. <% @player_2_name %>
Failures:

  1) Enter names submitting names
     Failure/Error: fill_in "player_1_name", with: "Dave"

     Capybara::ElementNotFound:
       Unable to find field "player_1_name" that is not disabled
     # /Users/student/.rvm/gems/ruby-2.6.3/gems/capybara-3.28.0/lib/capybara/node/finders.rb:296:in `block in synced_resolve'
     # /Users/student/.rvm/gems/ruby-2.6.3/gems/capybara-3.28.0/lib/capybara/node/base.rb:83:in `synchronize'
     # /Users/student/.rvm/gems/ruby-2.6.3/gems/capybara-3.28.0/lib/capybara/node/finders.rb:287:in `synced_resolve'
     # /Users/student/.rvm/gems/ruby-2.6.3/gems/capybara-3.28.0/lib/capybara/node/finders.rb:52:in `find'
     # /Users/student/.rvm/gems/ruby-2.6.3/gems/capybara-3.28.0/lib/capybara/node/actions.rb:91:in `fill_in'
     # /Users/student/.rvm/gems/ruby-2.6.3/gems/capybara-3.28.0/lib/capybara/session.rb:749:in `block (2 levels) in <class:Session>'
     # /Users/student/.rvm/gems/ruby-2.6.3/gems/capybara-3.28.0/lib/capybara/dsl.rb:51:in `block (2 levels) in <module:DSL>'
     # ./spec/features/enter_names_spec.rb:4:in `block (2 levels) in <top (required)>'

Finished in 0.07645 seconds (files took 0.94706 seconds to load)
2 examples, 1 failure

Failed examples:

rspec ./spec/features/enter_names_spec.rb:2 # Enter names submitting names

1 个答案:

答案 0 :(得分:1)

我的猜测是,如果您访问根路径,则会看到Testing infrastructure working!。这是因为get '/'被定义了两次,在我的Sinatra版本(v2.0.5)中,第一个声明获胜。

这是呈现该表单的此服务器的简单版本。它应该通过测试:

# app.rb

require 'sinatra'

# get '/' defined once
get '/' do
  erb :index
end

post '/names' do
  @player_1_name = params[:player_1_name]
  @player_2_name = params[:player_2_name]
  erb :play
end

运行方式:

$ ruby app.rb

注意事项:您还必须在播放视图中添加第二个等号,因此ERB知道@player_2_name是Ruby表达式。

# views/play.erb

<%= @player_1_name %> vs. <%= @player_2_name %>