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。何も思いつきません。これは非常に無人の動作です。

更新:post代わりpost.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 に答える