2

我有一个测试用例:

#spec/features/post_spec.rb
require 'spec_helper'

describe "Posts" do
  subject { page }

  describe "edit" do

    post=FactoryGirl.create(:post)
    puts post.valid?
    puts post_path(post.id)
    puts post.id

    before { visit edit_post_path(post.id) }
    it {should have_content('Editing')}
    it {current_path.should == edit_post_path(post.id)}

  end
end

我在通过路由系统生成 URL 时遇到问题:

$rspec spec/features/posts_spec.rb 
true
81
FF

Failures:

  1) Posts edit 
     Failure/Error: before { visit edit_post_path(post.id) }
     ActionController::UrlGenerationError:
       No route matches {:action=>"edit", :controller=>"posts", :locale=>81, :id=>nil, :format=>nil} missing required keys: [:id]
     # ./spec/features/2posts_spec.rb:13:in `block (3 levels) in <top (required)>'

  2) Posts edit 
     Failure/Error: before { visit edit_post_path(post.id) }
     ActionController::UrlGenerationError:
       No route matches {:action=>"edit", :controller=>"posts", :locale=>81, :id=>nil, :format=>nil} missing required keys: [:id]
     # ./spec/features/2posts_spec.rb:13:in `block (3 levels) in <top (required)>'

Finished in 0.00592 seconds
2 examples, 2 failures

Failed examples:

rspec ./spec/features/2posts_spec.rb:15 # Posts edit 
rspec ./spec/features/2posts_spec.rb:16 # Posts edit 

Randomized with seed 6503

如您所见,id生成链接中不存在该参数,而语言环境参数具有该id参数!我不知道。这是非常无人看管的行为。

更新:我尝试postpost.id. edit_post_path这是结果:

$rspec spec/features/posts_spec.rb 
true
83
FF

Failures:

  1) Posts edit 
     Failure/Error: before { visit edit_post_path(post) }
     ActionController::UrlGenerationError:
       No route matches {:action=>"edit", :controller=>"posts", :locale=>#<Post id: 83, title: "Vel Voluptas Veniam Ea Neque", autor: "Christina Rogahn", img_path: "Ut Iste Dolore", body: "Adipisci cupiditate eum eum deleniti facilis. Itaqu...", created_at: "2013-10-28 17:26:30", updated_at: "2013-10-28 17:26:31", email: "candelario@abernathy.name", user_id: 1>, :id=>nil, :format=>nil} missing required keys: [:id]
     # ./spec/features/2posts_spec.rb:13:in `block (3 levels) in <top (required)>'

  2) Posts edit 
     Failure/Error: before { visit edit_post_path(post) }
     ActionController::UrlGenerationError:
       No route matches {:action=>"edit", :controller=>"posts", :locale=>#<Post id: 83, title: "Vel Voluptas Veniam Ea Neque", autor: "Christina Rogahn", img_path: "Ut Iste Dolore", body: "Adipisci cupiditate eum eum deleniti facilis. Itaqu...", created_at: "2013-10-28 17:26:30", updated_at: "2013-10-28 17:26:31", email: "candelario@abernathy.name", user_id: 1>, :id=>nil, :format=>nil} missing required keys: [:id]
     # ./spec/features/2posts_spec.rb:13:in `block (3 levels) in <top (required)>'

Finished in 0.00532 seconds
2 examples, 2 failures

Failed examples:

rspec ./spec/features/2posts_spec.rb:14 # Posts edit 
rspec ./spec/features/2posts_spec.rb:15 # Posts edit 

Randomized with seed 32039

这是我的 routes.rb 文件:

#config/routes.rb
SitoNegozio::Application.routes.draw do
  scope "(:locale)", locale: /it|en/ do

  devise_for :users , controllers: {omniauth_callbacks: "users/omniauth_callbacks"}

  resources :users
  resources :posts do
    resources :msgs
  end

  root :to => 'static_pages#index'

  end
end

解决了:

#https://github.com/rspec/rspec-rails/issues/255#issuecomment-24698753
  config.before(:each, type: :feature) do
    default_url_options[:locale] = I18n.default_locale
  end
4

2 回答 2

1

对于任何遇到类似错误的人。

还值得注意的是,missing required keys: [:id]如果您不在控制器中设置编辑方法的实例,您可能会得到,所以它应该是这样的:

def edit
  @post = Post.find(params[:id])
end

您的功能方法看起来像:

background do
  @post = Post.create!(:name => 'Testing')
end

visit edit_post_path(@post)
fill_in 'post_name', with: 'Testing Article'
click_button 'Update Post'

您的视图看起来像这样:

<%= form_for :post, url: post_path(@post), method: :patch do |form| %>
    <%= @post.errors.full_messages %>
  <%= form.label :name %>
  <%= form.text_field :name %>
  <%= form.submit "Update Post" %>
<% end %>
于 2015-04-08T14:14:58.780 回答
0

而不是做,

visit edit_post_path(post.id)

删除.id并尝试执行:

visit edit_post_path(post)
于 2013-10-28T16:31:17.960 回答