7

Viene visualizzato il seguente errore e non riesco a capire come risolverlo. Ci sono altre pagine su Stack Overflow che risolvono problemi simili, ma questi non sembrano applicarsi, o almeno non sono abbastanza esperto per risolverlo.Metodo non definito 'patch' per # <Rspec :: Core - Esercitazioni su Rails Capitolo 9

Quando si esegue il authentication_pages_spec, il problema sembra essere con l'uso di "patch", con conseguente errore di seguito. Nota che ho provato a sostituire "patch" con "put" e ottenere gli stessi risultati.

Failures: 

1) Authentication authorization for non-signed-in users in the Users controller submitting to the update action 
Failure/Error: before { patch user_path(user) } 
NoMethodError: 
    undefined method `patch' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_3::Nested_1::Nested_1::Nested_2:0x007fa7e4df1e50> 
# ./spec/features/authentication_pages_spec.rb:59:in `block (6 levels) in <top (required)>' 

Finished in 0.34392 seconds 
2 examples, 1 failure 

NOTA: sulla base di discussione sul Stack Overflow here e blog it references here ho deciso di cambiare la mia spec/cartella Richieste a spec/caratteristiche, dal momento che questo sembra essere quello Capybara richiede dopo la versione 2.0.

Ecco il mio Gemfile: fonte 'https://rubygems.org' ruby ​​'2.0.0' # rubino GemSET = railstutorial_rails_4_0

gem 'rails', '4.0.0' 
gem 'bootstrap-sass', '2.3.2.0' 
gem 'pg', '0.15.1' 
gem 'bcrypt-ruby', '3.0.1' 

group :development, :test do 
    gem 'rspec-rails', '2.13.1' 
    gem 'guard-rspec', '2.5.0' 
    gem 'spork-rails', github: 'sporkrb/spork-rails' 
    gem 'guard-spork', '1.5.0' 
    gem 'childprocess', '0.3.9' 
end 

group :test do 
    gem 'selenium-webdriver', '2.0.0' 
    gem 'capybara', '2.1.0' 
    gem 'growl', '1.0.3' 
    gem 'factory_girl_rails', '4.2.1' 
    gem 'cucumber-rails', '1.3.0', :require => false 
    gem 'database_cleaner', github: 'bmabey/database_cleaner' 
end 

gem 'sass-rails', '4.0.0' 
gem 'uglifier', '2.1.1' 
gem 'coffee-rails', '4.0.0' 
gem 'jquery-rails', '2.2.1' 
gem 'turbolinks', '1.1.1' 
gem 'jbuilder', '1.0.2' 

group :doc do 
    gem 'sdoc', '0.3.20', require: false 
end 

group :production do 
    gem 'pg', '0.15.1' 
    gem 'rails_12factor', '0.0.2' 
end 

ho modificato il mio Guardfile utilizzare le specifiche/caratteristiche cartella invece delle specifiche/richieste cartella:

require 'active_support/inflector' 

guard 'spork', :cucumber_env => { 'RAILS_ENV' => 'test' }, 
       :rspec_env => { 'RAILS_ENV' => 'test' } do 

    watch('config/application.rb') 
    watch('config/environment.rb') 
    watch('config/environments/test.rb') 
    watch(%r{^config/initializers/.+\.rb$}) 
    watch('Gemfile') 
    watch('Gemfile.lock') 
    watch('spec/spec_helper.rb') { :rspec } 
    watch('test/test_helper.rb') { :test_unit } 
    watch(%r{features/support/}) { :cucumber } 
end 

guard 'rspec', all_after_pass: false, cli: '--drb' do 
    watch(%r{^spec/.+_spec\.rb$}) 
    watch(%r{^lib/(.+)\.rb$})  { |m| "spec/lib/#{m[1]}_spec.rb" } 
    watch('spec/spec_helper.rb') { "spec" } 

    # Rails example 
    watch(%r{^app/(.+)\.rb$})       { |m| "spec/#{m[1]}_spec.rb" } 
    watch(%r{^app/(.*)(\.erb|\.haml)$})     { |m| "spec/#{m[1]}#{m[2]}_spec.rb" } 
    watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] } 
    watch(%r{^spec/support/(.+)\.rb$})     { "spec" } 
    watch('config/routes.rb')       { "spec/routing" } 
    watch('app/controllers/application_controller.rb') { "spec/controllers" } 

    # Capybara features specs 
    watch(%r{^app/views/(.+)/.*\.(erb|haml)$})   { |m| "spec/features/#{m[1]}_spec.rb" } 

    # Turnip features and steps 
    watch(%r{^spec/acceptance/(.+)\.feature$}) 
    watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' } 

    # Custom Rails Tutorial specs 
    watch(%r{^app/controllers/(.+)_(controller)\.rb$}) do |m| 
    ["spec/routing/#{m[1]}_routing_spec.rb", 
    "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", 
    "spec/acceptance/#{m[1]}_spec.rb", 
    (m[1][/_pages/] ? "spec/features/#{m[1]}_spec.rb" : 
         "spec/features/#{m[1].singularize}_pages_spec.rb")] 
    end 
    watch(%r{^app/controllers/sessions_controller\.rb$}) do |m| 
    "spec/features/authentication_pages_spec.rb" 
    end 
end 

utenti regolatore qui:

class UsersController < ApplicationController 
    attr_accessor :name, :email 
    before_action :signed_in_user, only: [:edit, :update] 

    def show 
    @user = User.find(params[:id]) 
    end 

    def new 
    @user = User.new 
    end 

    def create 
    @user = User.new(user_params) 
    if @user.save 
     sign_in @user 
     flash[:success] = "Welcome to the Sample App!" 
     redirect_to @user 
    else 
     flash[:error] = "Oops!" 
     render 'new' 
    end 
    end 

    def edit 
    @user = User.find(params[:id]) 
    end 

    def update 
    @user = User.find(params[:id]) 
    if @user.update_attributes(user_params) 
     flash[:success] = "Profile updated" 
     sign_in @user 
     redirect_to @user 
    else 
     render 'edit' 
    end 
    end 

    private 

    def user_params 
     params.require(:user).permit(:name, 
         :email, :password, :password_confirmation) 
    end 

    # Before filters 

    def signed_in_user 
     redirect_to signin_url, notice: "Please sign in." unless signed_in? 
    end 
end 

Spec file di aiuto qui:

require 'rubygems' 
require 'spork' 
#uncomment the following line to use spork with the debugger 
#require 'spork/ext/ruby-debug' 


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

    Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f } 
    ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration) 

    RSpec.configure do |config| 

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

    config.use_transactional_fixtures = true 

    config.infer_base_class_for_anonymous_controllers = false 

    config.order = "random" 

    config.include Capybara::DSL 

    # Added below myself, troubleshooting an 'undefined method 'patch'' message 
    config.include Rails.application.routes.url_helpers 
    end 
end 

Spork.each_run do 
    # This code will be run each time you run your specs. 

end 

Infine, per buona misura, il file di configurazione/routes.rb è qui:

SampleApp::Application.routes.draw do 
    resources :users 
    resources :sessions, only: [:new, :create, :destroy] 

    root 'static_pages#home' 

    match '/signup', to: 'users#new',    via: 'get' 
    match '/signin', to: 'sessions#new',   via: 'get' 
    match '/signout', to: 'sessions#destroy',  via: 'delete' 
    match '/help',  to: 'static_pages#help',  via: 'get' 
    match '/about',  to: 'static_pages#about', via: 'get' 
    match '/contact', to: 'static_pages#contact', via: 'get' 

C'è una discussione simile su Stack Overflow here, ma la risposta su quel post è di spostare i test da ./spec/requests a ./spec/features - cosa che ho già fatto.

Un'altra discussione correlata here, in cui la risposta è utilizzare require 'spec_helper' nella parte superiore del file di funzionalità ... che ho già.

Un'ultima osservazione: sembra che gran parte della discussione su questo argomento indichi che Capybara ha bisogno di test situati nella cartella spec/features per poter accedere agli helper degli URL, ma il mio file authentication_pages_spec.rb sembra non avere problemi con "visita".

Apprezzare qualsiasi intuizione! The Rails Tutorial for Rails 4.0 è in beta, stiamo cercando di capire se questo è un bug.

* UPDATE *

Hai tutto passando verde dopo aver implementato il suggerimento di Peter. In seguito è il codice rivisto dal file authentication_pages_spec (solo la sezione parziale, "autorizzazione"):

describe "authorization", type: :request do 

    . 
    . 
    . 

    describe "as wrong user" do 
     let(:user) { FactoryGirl.create(:user) } 
     let(:wrong_user) {FactoryGirl.create(:user, email: "[email protected]") } 
     before { sign_in user, no_capybara: true } 

     describe "visiting Users#edit page" do 
     before { visit edit_user_path(wrong_user) } 
     it { should_not have_title(full_title('Edit user')) } 
     end 

     describe "submitting a PATCH request to the Users#update action" do 
     before { patch user_path(wrong_user) } 
     # NOTE: Rails Tutorial uses root_url below not root_path 
     specify { expect(response).to redirect_to(root_path) } 
     end 
    end 
    end 
end 
+0

sei scappato in un problema utilizzando le gemme e codice specifico che Michael ha incluso nel suo tutorial? Di solito è estremamente attento riguardo a queste cose. –

+0

Inizialmente sono rimasto fedele al tutorial, ma poi ho riscontrato alcuni problemi usando la 'visita' nel file spec - stava ritornando 'errore metodo non definito'. Il problema sembra essere il modo in cui Capybara 2.0 gestisce i collegamenti: richiede che i test di integrazione siano nella cartella spec/features. Vedi [qui] (http://stackoverflow.com/questions/13496196/why-arent-my-spec-support-files-being-picked-up-with-rspec/18231153#18231153) e anche [qui] (http : //www.andylindeman.com/2012/11/11/rspec-rails-and-capybara-2.0-what-you-need-to-know.html). – Scro

risposta

9

get, put, patch, ecc sono definiti solo per :controller e :request specifiche, non per un :feature spec, che il tuo test authentication_pages_spec.rb è diventato implicitamente quando hai cambiato la sua posizione.Se includi type: :request nel tuo livello superiore describe, dovrebbe funzionare.

+0

Grazie Peter, ha funzionato. Un'altra cosa strana: ho continuato a ricevere un "host mancante da collegare a"! errore, che sembra essere associato all'uso di 'redirect_to (root_url)' nel test per PATCH. Dopo diverse ore di tentativi di correggere il routing, l'impostazione dell'host nei file di configurazione dell'ambiente, ecc., Ho rinunciato e lo ho sostituito con 'redirect_to (root_path)' e tutti i test ora stanno passando in verde. – Scro

0

questa risposta risolve anche questo test rspec non riuscendo senza errori, che fa parte del Rails Tutorial Capitolo 9 (spec/richieste/authentication_pages_spec.rb)

describe "submitting to the update action" do 

     before { patch user_path(user) } 

     specify { response.should redirect_to(signin_path) } 

    end 
Problemi correlati