Capybara NoMethodError:未定义的方法`visit’for

感谢回复。
我在应用程序Git应用程序中收到错误错误

Failures: 1) Page pages page creation with invalid information should not create a page Failure/Error: before(:each) { visit new_admin_page_path } NoMethodError: undefined method `visit' for # # ./spec/requests/page_request_spec.rb:13:in `block (3 levels) in ' 2) Page pages page creation with invalid information error messages Failure/Error: before(:each) { visit new_admin_page_path } NoMethodError: undefined method `visit' for # # ./spec/requests/page_request_spec.rb:13:in `block (3 levels) in ' Finished in 1.21 seconds 14 examples, 2 failures 

我错过了什么?

我克隆了您的存储库并运行了规范。 问题是你正在使用术语page两个不同的东西,Capybara页面( subject { page } )和你的模型名称Page (你也命名page )。 这两个名称冲突,这就是为什么rspec抱怨没有#方法visit

要解决此问题,只需重命名您在初始let创建的页面:

 let(:mypage) { Factory.create(:page) } 

这将通过命名您的页面模型mypage而不是page来避免冲突。

但是还有其他问题。 您的用户工厂不使用序列来分配电子邮件,因此您会收到validation错误,因为它表示电子邮件已被删除。

我将您的用户工厂更改为:

 sequence(:email) { |n| "abc#{n}@example.com"} factory :user do email password "foobar" password_confirmation "foobar" ... 

这修复了validation错误,但现在又出现了另一个错误。 在第一个规范的行中,您应该检查 Page上的count是否没有变化,而不是记录 page (或mypage )。

所以改为:

 expect { click_button "Create Page" }.not_to change(Page, :count) 

仍然会给您带来错误,因为您还没有对PagesController进行任何create操作。 从您所写的内容来看,信息似乎无效,因此它甚至不应该采取这种行动。 我不知道你到底想要做什么,所以我会留下剩下的让你弄清楚。

如果您最近升级到Capybara 2.0并且您的集成测试与以前版本的Capybara一起使用,您可以尝试将请求目录重命名为function。 查看http://www.codelearn.org/blog/how-to-make-old-integration-tests-work-with-capybara-2-0

将以下内容添加到spec/spec_helper.rb (在Spork.prefork块中):

 require 'capybara/rspec' require 'capybara/rails'