Scr*_*cro 7 rspec ruby-on-rails capybara railstutorial.org ruby-on-rails-4
我收到以下错误,无法弄清楚如何解决它.Stack Overflow上还有一些其他页面可以解决类似的问题,但这些似乎并不适用,或者至少我不够精明,无法解决这个问题.
当我运行authentication_pages_spec时,问题似乎是使用"patch",导致下面的失败.请注意,我已经尝试用"put"替换"patch"并获得相同的结果.
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
Run Code Online (Sandbox Code Playgroud)
注意:根据Stack Overflow的讨论和这里引用的博客,我选择将我的spec/requests文件夹更改为spec/features,因为这似乎是Capybara在2.0版之后所要求的.
这是我的Gemfile:源' https : //rubygems.org'ruby'2.0.0'#ruby-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
Run Code Online (Sandbox Code Playgroud)
我修改了我的Guardfile以使用spec/features文件夹而不是spec/requests文件夹:
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
Run Code Online (Sandbox Code Playgroud)
用户控制器:
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
Run Code Online (Sandbox Code Playgroud)
Spec helper文件在这里:
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
Run Code Online (Sandbox Code Playgroud)
最后,为了更好地衡量,config/routes.rb文件在这里:
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'
Run Code Online (Sandbox Code Playgroud)
有堆栈溢出类似的讨论在这里,但该职位的答案是,从移动到./spec/requests的./spec/features测试-我已经完成了.
这里有另一个相关的讨论,答案是require 'spec_helper'在功能文件的顶部使用...我已经拥有了.
最后一个观察:似乎很多关于这个主题的讨论表明问题是Capybara需要在spec/features文件夹中进行测试才能访问URL帮助程序 - 但我的authentication_pages_spec.rb文件似乎没有问题与'访问'.
欣赏任何见解!Rails 4.0的Rails教程处于测试阶段,一直试图弄清楚这是不是一个bug.
*更新*
在实施彼得的建议后,一切都变成了绿色.以下是authentication_pages_spec文件中的修订代码(部分,只是"授权"部分):
describe "authorization", type: :request do
.
.
.
describe "as wrong user" do
let(:user) { FactoryGirl.create(:user) }
let(:wrong_user) {FactoryGirl.create(:user, email: "wrong@example.com") }
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
Run Code Online (Sandbox Code Playgroud)
get,put,patch,等只能用于定义:controller和:request规范,而不是一个:feature规范,该规范你authentication_pages_spec.rb,当你改变了它的位置,测试隐含成了.如果你包括type: :request在你的顶级describe,它应该工作.
| 归档时间: |
|
| 查看次数: |
2568 次 |
| 最近记录: |