Rails Rspec错误 – 未定义的方法`访问’

所以我是TDD的新手,我在我的测试中抛出一些Rspec错误…基本上在运行bundle exec rspec spec之后,我得到一些undefined method 'visit'错误我的一些规范。 任何有关如何通过这些测试的帮助将非常感激:谢谢。

 Failures: 1) User pages profile page Failure/Error: before { visit user_path(user) } NoMethodError: undefined method `visit' for #  # ./spec/requests/user_pages_spec.rb:9:in `block (3 levels) in ' 2) User pages profile page Failure/Error: before { visit user_path(user) } NoMethodError: undefined method `visit' for # # ./spec/requests/user_pages_spec.rb:9:in `block (3 levels) in ' 3) User pages signup page Failure/Error: before { visit signup_path } NoMethodError: undefined method `visit' for # # ./spec/requests/user_pages_spec.rb:16:in `block (3 levels) in ' 4) User pages signup page Failure/Error: before { visit signup_path } NoMethodError: undefined method `visit' for # # ./spec/requests/user_pages_spec.rb:16:in `block (3 levels) in ' Finished in 9.08 seconds 24 examples, 4 failures Failed examples: rspec ./spec/requests/user_pages_spec.rb:11 # User pages profile page rspec ./spec/requests/user_pages_spec.rb:12 # User pages profile page rspec ./spec/requests/user_pages_spec.rb:18 # User pages signup page rspec ./spec/requests/user_pages_spec.rb:19 # User pages signup page 

我的spec / requests / user_pages_spec.rb

 require 'spec_helper' describe "User pages" do subject { page } describe "profile page" do let(:user) { FactoryGirl.create(:user) } # Code to make a user variable before { visit user_path(user) } it { should have_selector('h1', text: user.name) } it { should have_selector('title', text: user.name) } end describe "signup page" do before { visit signup_path } it { should have_selector('h1', text: 'Sign up') } it { should have_selector('title', text: 'Sign up') } end end 

还有我的spec / models / user_spec.rb

 require 'spec_helper' describe User do before do @user = User.new(name: "Example User", email: "user@example.com", password: "foobar", password_confirmation: "foobar") end subject { @user } it { should respond_to(:name) } it { should respond_to(:email) } it { should respond_to(:password_digest) } it { should respond_to(:password) } it { should respond_to(:password_confirmation) } it { should respond_to(:authenticate) } it { should be_valid } describe "when name is not present" do before { @user.name = " " } it { should_not be_valid } end describe "when email is not present" do before { @user.email = " " } it { should_not be_valid } end describe "when name is too long" do before { @user.name = "a" * 51 } it { should_not be_valid } end describe "when email format is invalid" do it "should be invalid" do addresses = %w[user@foo,com user_at_foo.org example.user@foo. foo@bar_baz.com foo@bar+baz.com] addresses.each do |invalid_address| @user.email = invalid_address @user.should_not be_valid end end end describe "when email format is valid" do it "should be valid" do addresses = %w[user@foo.COM A_US-ER@fborg frst.lst@foo.jp a+b@baz.cn] addresses.each do |valid_address| @user.email = valid_address @user.should be_valid end end end describe "when email address is already taken" do before do user_with_same_email = @user.dup user_with_same_email.email = @user.email.upcase user_with_same_email.save end it { should_not be_valid } end describe "when password is not present" do before { @user.password = @user.password_confirmation = " " } it { should_not be_valid } end describe "with a password that's too short" do before { @user.password = @user.password_confirmation = "a" * 5 } it { should be_invalid } end describe "return value of authenticate method" do before { @user.save } let(:found_user) { User.find_by_email(@user.email) } describe "with valid password" do it { should == found_user.authenticate(@user.password) } end describe "with invalid password" do let(:user_for_invalid_password) { found_user.authenticate("invalid") } it { should_not == user_for_invalid_password } specify { user_for_invalid_password.should be_false } end end describe "when password doesn't match confirmation" do before { @user.password_confirmation = "mismatch" } it { should_not be_valid } end describe "when password confirmation is nil" do before { @user.password_confirmation = nil } it { should_not be_valid } end end 

最后我的观点/ users / new.html.erb

  

Sign up

Find me in app/views/users/new.html.erb

和views / users / show.html.erb

  

我添加了我的UsersController

 class UsersController < ApplicationController def new end def show @user = User.find(params[:id]) end end 

根据Billy的解决方案,在修复后现在也会出现这个新错误

 Failures: 1) User pages signup page Failure/Error: it { should have_selector('title', text: 'Sign up') } Capybara::ExpectationNotMet: expected to find css "title" with text "Sign up" but there were no matches. Also found "", which matched the selector but not all filters. # ./spec/features/user_pages_spec.rb:19:in `block (3 levels) in ' 2) User pages profile page Failure/Error: it { should have_selector('title', text: user.name) } Capybara::ExpectationNotMet: expected to find css "title" with text "Michael Hartl" but there were no matches. Also found "", which matched the selector but not all filters. # ./spec/features/user_pages_spec.rb:12:in `block (3 levels) in ' Finished in 9.41 seconds 24 examples, 2 failures Failed examples: rspec ./spec/features/user_pages_spec.rb:19 # User pages signup page rspec ./spec/features/user_pages_spec.rb:12 # User pages profile page 

问题出在这里:

 ./spec/requests/user_pages_spec.rb 

您将Capybara集成测试放在requests文件夹中。 这就是方法visit不起作用的原因。

要修复,只需将所有测试从spec/requestsspec/features

发生这种情况是因为您正在尝试使用Capybara::DSLvisit方法。 如果您查看文档 :

  Capybara不再受支持
 请求Capybara 2.0.0的规格。 推荐使用Capybara的方法是
 具有function规格。

要解决此问题,您应将测试移至spec/features文件夹或包含Capybara::DSL以获取请求规范:

 #spec_helper.rb RSpec.configure do |config| #... config.include Capybara::DSL, :type => :request