Capybara在测试中给出了可能的路由问题的NoElementFound错误?

时间:2012-05-16 18:28:24

标签: ruby-on-rails rspec capybara

Capybara在我的测试中给了我NoElementFound错误 我的考试

Describe "agenda pages" do
    subject { page }

    login_user

    describe "Agenda Creation" do
        before { visit users_path }

        describe "with invalid information" do
            it "should not create an agenda" do
                expect { click_button "Post" }.should_not change(Agenda, :count)
            end
            describe "error message" do
                before  { click_button "Post" }
                it { should have_content('error') }
            end
        end

        describe "with valid information" do
            before  { fill_in 'agenda_subject', with: "Lorem Ipsum" }
            it "should create a an agenda" do
                expect { click_button "Post" }.should change(Agenda, :count).by(1)
            end
        end

    end

我的怀疑是水豚因为我访问过users_path而找不到元素,它只是看不到页面。注意,行为在生产力方面是预期的并且正在工作)如果我将其更改为root_path,我会得到相同的错误。 我的spec_helper文件启用了url_helpers,表单正确且值正确。 至少我确定,表格是在帖子的最后 我的路线

   root        /                              users#index
                    root        /                              home#index
        new_user_session GET    /users/sign_in(.:format)       devise/sessions#new
            user_session POST   /users/sign_in(.:format)       devise/sessions#create
    destroy_user_session DELETE /users/sign_out(.:format)      devise/sessions#destroy
           user_password POST   /users/password(.:format)      devise/passwords#create
       new_user_password GET    /users/password/new(.:format)  devise/passwords#new
      edit_user_password GET    /users/password/edit(.:format) devise/passwords#edit
                         PUT    /users/password(.:format)      devise/passwords#update
cancel_user_registration GET    /users/cancel(.:format)        devise/registrations#cancel
       user_registration POST   /users(.:format)               devise/registrations#create
   new_user_registration GET    /users/sign_up(.:format)       devise/registrations#new
  edit_user_registration GET    /users/edit(.:format)          devise/registrations#edit
                         PUT    /users(.:format)               devise/registrations#update
                         DELETE /users(.:format)               devise/registrations#destroy
                   users GET    /users(.:format)               users#index
                 agendas POST   /agendas(.:format)             agendas#create
                  agenda DELETE /agendas/:id(.:format)         agendas#destroy

路由文件

Engage::Application.routes.draw do
  authenticated :user do
    root to: 'users#index'
  end
  root :to => "home#index"
  devise_for :users
  resources :users, only: [:index]
  resources :agendas, only: [:create, :destroy]
end

我正在使用规范和设计。这是渲染的形式:

<%= form_for(@agenda) do |f| %>
  <div class="field">
    <%= f.text_area :subject, placeholder: "Compose new agenda..." %>
  </div>
  <%= f.submit "Post", class: "btn btn-large btn-primary" %>
<% end %>

1 个答案:

答案 0 :(得分:0)

因此,对于控制器测试,你真的不应该使用水豚。 Capybara是一个用于驱动浏览器的集成测试库。要直接测试控制器,您需要为相关操作设置请求并发布/获取/放置/等,并验证您是否获得了您对操作的期望。通常这将验证创建记录或检查实例变量的内容。

您的控制器不知道路由。单元测试的要点是测试它与这些其他组件隔离。要与Capybara一起测试,请进行集成测试。 (整合=一次不止一件事!)

例如:

expect { post :create, agenda: FactoryGirl.attributes_for(:agenda)}.to change(Agenda, :count).by(1)

agenda = FactoryGirl.create(:agenda)
get :show, id: agenda
assigns(:agenda).should eq agenda