开发者

Few questions about capybara

开发者 https://www.devze.com 2023-03-13 20:27 出处:网络
I\'ve got a few questions about Capybara. And I might as well ask here since the RDOC in the github page for Capybara is great to get it set up and running. But where is the API or list of available m

I've got a few questions about Capybara. And I might as well ask here since the RDOC in the github page for Capybara is great to get it set up and running. But where is the API or list of available methods??

First. Per *_spec.rb file, should scenario only exist once? Or is it fine to have multiple scenario's in one file?

For example, in spec/request/user_spec.rb:

require 'spec_helper'

feature 'User actions' do
  background do
    data = {
      :first_name => 'foo',
      :last_name  => 'bar',
      ...
    }

    user = User.new(data, :as => :user)
    user.save
  end

  scenario 'User can browse home page' do
    visit root_path
    page.should have_content('Homepage')
  end

  scenario 'User should not be able to visit the dashboard' do
    visit dashboard_root_path
    page.should have_content('You are not authorized to access this page.')
  end
end

If there is anything wrong with the code structure above, or if there is room for improvement. I am open feedback.

Second. I notice with the code above. If I have config.use_transactional_fixtures = false in spec/spec_helper.rb, it saves the user twice. This means, in my test database / user table, I would have 2 users named 'foo bar'. Is this normal?

Third. I have a form that has an HT开发者_如何学编程ML button. When user clicks on this button, jQuery submits the form. How would I test this with Capybara? I don't think click_button "Add" will do the trick.

Fourth. How would I sign in users in Capybara? I am using Devise. Would sign_in User.first do the trick? And would I be able to access current_user in Capybara?

Lastly, if anyone knows any "Getting Started" guides / tutorials on Rspec + Capybara. Please do mention.


I've also switched over to writing request specs ever since i decided that I was no longer liking Cucumber.

ONE) Having multiple scenarios is indeed fine. You get to use all the other great features of rspec, so I would suggest also using contexts as in the code at the bottom.

TWO) This can probably be solved by using the Rspec Set Gem And the Database Cleaner Gem. Also: The Original Rationale for Set

Warning: make sure you set up DatabaseCleaner correctly when you use set. My own setup (which may be a little overkill but is working for me):

config.before(:suite) do
    DatabaseCleaner.clean_with :truncation    
 end

   config.before(:all) do
    DatabaseCleaner.clean_with :truncation
  end

    config.after(:all) do
    DatabaseCleaner.clean_with :truncation
  end

  config.after(:suite) do
    DatabaseCleaner.clean_with :truncation
  end

THREE) yep! click_button "Add" should work! The complete capybara API is useful but took me a while to grok. Of most relevant importance are the actions and rspec matchers.

example:

click_button "Add"
page.should have_content("Successfully Added")

you can narrow the scope with element finders.

FOURTH) Devise provides helpers. there is a sign_in helper. read the dox :). Here's a demo:

feature 'User actions' do
  background do
    data = {
      :first_name => 'foo',
      :last_name  => 'bar',
      ...
    }

    @user = User.new(data, :as => :user)
    @user.save
  end

  context "no user is signed in" do 
    scenario 'User can browse home page' do
      visit root_path
      page.should have_content('Homepage')
    end

    scenario 'User should not be able to visit the dashboard' do
      visit dashboard_root_path
      page.should have_content('You are not authorized to access this page.')
    end
   end

  context "user is signed in" do

    before :each do 
      sign_in @user
    end

    [more scenarios]
  end
end

ultimately of course, you'd prolly want to split this up into more specific features. Probably have a "Public Navigation" Feature for all the tests that are about guests seeing content, and then a separate feature for a user signing in, etc.


I am not aware of capybara, but a full list of available methods can be found here:

http://rubydoc.info/github/jnicklas/capybara/master#

hope, that helps

0

精彩评论

暂无评论...
验证码 换一张
取 消