Capybara NoMethodError:未定义的方法`访问'对于

时间:2012-09-18 21:14:44

标签: ruby-on-rails rspec capybara

感谢回复 我在应用程序Git application with the error

中收到错误
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 #<Page:0x00000005094bb0>
     # ./spec/requests/page_request_spec.rb:13:in `block (3 levels) in <top (required)>'

  2) Page pages page creation with invalid information error messages 
     Failure/Error: before(:each) { visit new_admin_page_path }
     NoMethodError:
       undefined method `visit' for #<Page:0x000000051671f0>
     # ./spec/requests/page_request_spec.rb:13:in `block (3 levels) in <top (required)>'

Finished in 1.21 seconds
14 examples, 2 failures

我错过了什么?

3 个答案:

答案 0 :(得分:10)

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

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

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

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

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

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

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

修复了验证错误,但现在又出现了另一个错误。在第一个规范的第一行中,您应该检查 count上的Page是否发生了变化,而不是记录 {{1 (或page)。

所以改为:

mypage

这将给您留下错误,因为您expect { click_button "Create Page" }.not_to change(Page, :count) 也没有create行动。从您所写的内容来看,信息似乎无效,因此它甚至不应该采取这种行动。我不知道你到底想要做什么,所以我会留下剩下的让你弄清楚。

答案 1 :(得分:6)

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

答案 2 :(得分:3)

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

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