Ruby on rails Capybara::ElementNotFound和ArgumentError

Ruby on rails Capybara::ElementNotFound和ArgumentError,ruby-on-rails,rspec,capybara,Ruby On Rails,Rspec,Capybara,我更新了Rspec,现在我的Rspec测试有一半失败了 最初,所有测试都失败了,我通过在spec\u helper.rb中添加“config.infere\u spec\u type\u from\u file\u location!”使其中一半测试通过 第一种类型的错误消息是参数错误: 1) todo_lists/new renders new todo_list form Failure/Error: assigns(:todo_list, stub_model(TodoList,

我更新了Rspec,现在我的Rspec测试有一半失败了

最初,所有测试都失败了,我通过在spec\u helper.rb中添加“config.infere\u spec\u type\u from\u file\u location!”使其中一半测试通过

第一种类型的错误消息是参数错误:

  1) todo_lists/new renders new todo_list form
 Failure/Error: assigns(:todo_list, stub_model(TodoList,
 ArgumentError:
   wrong number of arguments (2 for 0..1)
 # ./spec/views/todo_lists/new.html.erb_spec.rb:5:in `block (2 levels) in <top (required)>'
等级库辅助文件:

   ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
# require 'rspec/autorun'
require 'capybara/rspec'
require 'capybara/rails'

Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }


ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration)

RSpec.configure do |config|
  config.include TodoListHelpers, type: :feature
  config.include Capybara::DSL

  config.fixture_path = "#{::Rails.root}/spec/fixtures"

  config.use_transactional_fixtures = true

  config.infer_base_class_for_anonymous_controllers = false
  config.infer_spec_type_from_file_location!

  config.order = "random"
end

module ::RSpec::Core
  class ExampleGroup
    include Capybara::DSL
    include Capybara::RSpecMatchers
  end
end
待办事项列表/new.html.erb\u规范:

require 'spec_helper'

describe "todo_lists/new" do
  before(:each) do
    assigns(:todo_list, stub_model(TodoList,
      :title => "MyString",
      :description => "MyText"
    ).as_new_record)
  end

  it "renders new todo_list form" do
    render

# Run the generator again with the --webrat flag if you want to use webrat matchers
assert_select "form[action=?][method=?]", todo_lists_path, "post" do
  assert_select "input#todo_list_title[name=?]", "todo_list[title]"
  assert_select "textarea#todo_list_description[name=?]", "todo_list[description]"


  end
  end
end
功能/待办事项列表/编辑规格.rb

require 'spec_helper'

describe "Editing Todo Lists" do
  let!(:todo_list) {TodoList.create(title:       "Groceries",
                                    description: "Grocery list")}

  def update_todo_lists(options={})
    options[:title] ||= "New Title"
    options[:description] ||= "New Description"

todo_list = options[:todo_list]

visit '/todo_lists'
within "#todo_list_#{todo_list.id}" do
  click_link "Edit"
end

fill_in "Title", with: options[:title]
fill_in "Description", with: options[:description]
click_button "Update Todo list"
  end

  it "displays error when description is empty" do
update_todo_lists todo_list: todo_list, description: ""
description = todo_list.description

todo_list.reload

expect(page).to have_content("error")
expect(todo_list.description).to eq(description)


end
编辑视图:

<h1>Editing todo_list</h1>
编辑待办事项列表
| 和表格助手:

<%= form_for(@todo_list) do |f| %>
  <% if @todo_list.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@todo_list.errors.count, "error") %> 

`prohibited this todo_list from being saved:</h2>`

  <ul>
  <% @todo_list.errors.full_messages.each do |message| %>
    <li><%= message %></li>
  <% end %>
  </ul>
</div>

`禁止保存此待办事项列表:`




在视图文件中,您有一个文本字段,名为
:title
,但在spec文件中,您填写的是title。 水豚无法进入。这就是为什么水豚找不到头衔

另一个解决方案是在控制台中检查您的标题。标题的id是什么

如果id类似于“todo_title”,那么应该在spec文件中保持相同

像这样
填写“待办事项标题”
而不是
填写“标题”

您可以使用上述任一解决方案解决此问题。这对我有用


您也可以参考。

尝试在irb中启动水豚会话,并复制测试文件中的内容。如果您遇到问题,则更容易调试。听起来您所做的唯一更改是更新您的GEM文件,但在第二个规范上进行健全性测试并没有什么坏处。
<h1>Editing todo_list</h1>
<%= form_for(@todo_list) do |f| %>
  <% if @todo_list.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@todo_list.errors.count, "error") %> 

`prohibited this todo_list from being saved:</h2>`

  <ul>
  <% @todo_list.errors.full_messages.each do |message| %>
    <li><%= message %></li>
  <% end %>
  </ul>
</div>
  <div class="field">
    <%= f.label :title %><br>
    <%= f.text_field :title %>
  </div>
  <div class="field">


   <%= f.label :description %><br>
    <%= f.text_area :description %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>