2014-08-31 154 views
0

我更新了Rspec,现在我的一半Rspec测试失败了。水豚:: ElementNotFound和ArgumentError

最初,所有的测试都失败了,我可以通过添加“config.infer_spec_type_from_file_location!”来让其中的一半通过。到spec_helper.rb。

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

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)>' 

第二种类型是水豚:: ElementNotFound:

5) Editing Todo Lists displays error when description is empty 
Failure/Error: fill_in "Title", with: options[:title] 
Capybara::ElementNotFound: 
    Unable to find field "Title" 
# ./spec/features/todo_lists/edit_spec.rb:18:in `update_todo_lists' 
# ./spec/features/todo_lists/edit_spec.rb:55:in `block (2 levels) in <top (required)>' 

我的Gemfile:

source 'https://rubygems.org' 

gem 'rails', '4.1.4' 
gem 'sqlite3' 
gem 'sass-rails', '~> 4.0.3' 
gem 'uglifier', '>= 1.3.0' 
gem 'coffee-rails', '~> 4.0.0' 
gem 'turbolinks' 
gem 'jbuilder', '~> 2.0' 
gem 'sdoc', '~> 0.4.0',   group: :doc 

gem 'spring',  group: :development 

group :development, :test do 
    gem 'rspec-rails' 
end 


group :test do 
    gem 'capybara' 
    gem 'shoulda-matchers' 
end 

gem 'rspec-activemodel-mocks' 

Spec_Helper文件:

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 

todo_lists/new.html.erb_spec:

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 

功能/ todo_lists/edit_spec.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> 
<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 %> 
+0

尝试在irb中启动Capybara会话并复制测试文件中的内容。如果遇到问题,调试起来会更容易。这听起来像你所做的唯一更改就是更新你的Gemfile,但不会对第二个规范进行完整性测试。 – aceofbassgreg 2014-09-02 17:40:35

回答

0

在你查看文件你已经一个text_field为:title但在规范文件中您填写标题。 水豚不能进入。所以这就是为什么Capybara没有找到Title。

其他解决方案可以尝试在控制台中检查您的标题。标题是什么?

如果id是“todo_title”,那么你应该在spec文件中保持不变。

像这样fill_in "todo_title",而不是fill_in "Title"

可以与上述任何方案的解决这个问题。它为我工作。您可以参考this