8
From the Resource Library of Andolasoft.Inc | Web and Mobile App Development Company Ruby on Rails Integration Testing with Minitest and Capybara Hi Guys! I am back again with one more article about ruby on rails. I hope this is the right time to share one of my technical stuffs on ruby on rails after sharing PHP and Mobile stuffs. Minitest and Capybara: integration testing demystified In this article, I am going to share my own experience and ideas of ruby on rails integration testing using Minitest and Capybara and tell you the process how it serves as one of the most preferred alternative for controller test. A lot of you must have heard about Capybara but still for those who are new to this - Capybara is an acceptance test framework used for web applications and supports developers in integration testing of Ruby on Rails applications with Minitest. So, let’s get into the details about Capybara, Minitest and Integration Testing Minitest is the default and a complete testing suite for Ruby application, which supports ancillary test-driven development (TDD), behavior-driven development (BDD), mocking, and benchmarking for fast, clean and reliable test results. Whereas, Capybara is the acceptance test framework for web applications and frequently used for end-to-end testing in Rails Applications. Rails developer can suggest user on web page and Capybara provides API to interact with web page. Integration Testing are used to test the most important workflows of applications and test different fragments of application together while unit testing inspects the individual part of the application work. Before sharing the real process how to use Capybara with Minitest for integration testing of your Ruby on Rails applications, let me tell you the prerequisites of this testing process.

Ruby on rails integration testing with minitest and capybara

Embed Size (px)

Citation preview

Page 1: Ruby on rails integration testing with minitest and capybara

From the Resource Library of Andolasoft.Inc | Web and Mobile App Development Company

Ruby on Rails Integration Testing with Minitest and Capybara

Hi Guys! I am back again with one more article about ruby on rails.

I hope this is the right time to share one of my technical stuffs on ruby on rails after sharing

PHP and Mobile stuffs.

Minitest and Capybara: integration testing demystified

In this article, I am going to share my own experience and ideas of ruby on rails integration

testing using Minitest and Capybara and tell you the process how it serves as one of the

most preferred alternative for controller test.

A lot of you must have heard about Capybara but still for those who are new to this -

Capybara is an acceptance test framework used for web applications and supports

developers in integration testing of Ruby on Rails applications with Minitest.

So, let’s get into the details about Capybara, Minitest and Integration Testing

Minitest is the default and a complete testing suite for Ruby application, which supports

ancillary test-driven development (TDD), behavior-driven development (BDD), mocking, and

benchmarking for fast, clean and reliable test results.

Whereas, Capybara is the acceptance test framework for web applications and frequently

used for end-to-end testing in Rails Applications.

Rails developer can suggest user on web page and Capybara provides API to interact with

web page.

Integration Testing are used to test the most important workflows of applications and test

different fragments of application together while unit testing inspects the individual part of

the application work.

Before sharing the real process how to use Capybara with Minitest for integration testing of

your Ruby on Rails applications, let me tell you the prerequisites of this testing process.

Page 2: Ruby on rails integration testing with minitest and capybara

From the Resource Library of Andolasoft.Inc | Web and Mobile App Development Company

Ruby version 2.3.3, Rails version 5.0.0.1,

Minitest version 5.10.1, and Capybara version 2.11.1 are required for the smooth operation

and you can use gem install rails to get started.

Setup You can set up a new Rails application. rails new integration-testing-minitest We'll need to add Capybara to our Gemfile in the group test. # Gemfile ... group :test do gem 'minitest-rails-capybara' end Also need to load Capybara in order to use it in our tests. # test/test_helper.rb ENV['RAILS_ENV'] ||= 'test' requireFile.expand_path('../../config/environment', __FILE__) require 'rails/test_help' require "minitest/rails/capybara" ... Now, that you have everything set up, let’s see the integration tests with an example application. Running the scaffold generator to create posts. rails generate scaffold Post title:string body:text

Page 3: Ruby on rails integration testing with minitest and capybara

From the Resource Library of Andolasoft.Inc | Web and Mobile App Development Company

Next we need to migrate the database. rakedb:migrate == 20161214213527 CreatePosts: migrating ====================================== -- create_table(:posts) -> 0.0020s == 20161214213527 CreatePosts: migrated (0.0024s) ============================= rake # Running: ....... You can also issue rails server at the command line and navigate to http://localhost:3000/posts to check the result. Integration Tests Let's create our first integration test. # test/fixtures/posts.yml one: title: Post Title One body: Post body one. two: title: Post Title Two body: Post body two. Here's our first integration test. # test/integration/post_flow_test.rb require 'test_helper' classPostFlowTest< Capybara::Rails::TestCase def setup @one = posts :one @two = posts :two end

Page 4: Ruby on rails integration testing with minitest and capybara

From the Resource Library of Andolasoft.Inc | Web and Mobile App Development Company

test 'post index' do visitposts_path assertpage.has_content?(@one.title) assertpage.has_content?(@two.title) end end All youneed to do here is – to run all your tests again to make sure they all pass rake # Running: ........ Finished in 0.515325s, 15.5242 runs/s, 21.3458 assertions/s. 8 runs, 11 assertions, 0 failures, 0 errors, 0 skips Now, let’s move on to something a bit more complicated, and test if you can write a new post and submit it. Place it below other test in your integration test for posts. # test/integration/post_flow_test.rb ... test 'writing a new post' do visitposts_path click_on 'New Post' fill_in 'Title', with: 'Test Title' fill_in 'Body', with: 'Test Body' click_on 'Create Post' assert_current_pathpost_path(Post.last) assertpage.has_content?('Test Title') assertpage.has_content?('Test Body') end end

Page 5: Ruby on rails integration testing with minitest and capybara

From the Resource Library of Andolasoft.Inc | Web and Mobile App Development Company

Run the tests again to make sure everything passes. rake # Running: ......... Finished in 0.551475s, 16.3199 runs/s, 23.5731 assertions/s. 9 runs, 13 assertions, 0 failures, 0 errors, 0 skips Now, we have one last feature to add, the email alert to an admin email once a post has been submitted. Let's start by adding a new test for writing a new post and checking if an admin notice email was sent. # test/integration/post_flow_test.rb require 'test_helper' classPostFlowTest< Capybara::Rails::TestCase includeActiveJob::TestHelper def setup @one = posts :one @two = posts :two end test 'post index' do visitposts_path assertpage.has_content?(@one.title) assertpage.has_content?(@two.title) end test 'writing a new post' do write_new_post latest_post = Post.last assert_current_pathpost_path(latest_post) assertpage.has_content?('Test Title') assertpage.has_content?('Test Body') end test 'writing a new post' do write_new_post

Page 6: Ruby on rails integration testing with minitest and capybara

From the Resource Library of Andolasoft.Inc | Web and Mobile App Development Company

latest_post = Post.last assert_current_pathpost_path(latest_post) assertpage.has_content?('Test Title') assertpage.has_content?('Test Body') end test 'writing a new post sends admin notice' do perform_enqueued_jobs do write_new_post last_post = Post.last mail = ActionMailer::Base.deliveries.last assert_equal '[email protected]', mail['to'].to_s assert_equal 'New post added', mail.subject end end private defwrite_new_post visitposts_path click_on 'New Post' fill_in 'Title', with: 'Test Title' fill_in 'Body', with: 'Test Body' click_on 'Create Post' end end Let's create the mailer first: rails generate mailer PostMailer This should set up the mailer - Time to add our admin notice email to it: # app/mailers/post_mailer.rb classPostMailer<ApplicationMailer defadmin_notice(post) @post = post mail to: '[email protected]', subject: 'New post added' end

Page 7: Ruby on rails integration testing with minitest and capybara

From the Resource Library of Andolasoft.Inc | Web and Mobile App Development Company

end We also need the corresponding views: <%# app/views/post_mailer/admin_notice.html.erb %> <p>A new post has been added! Here's the post:</p> <p><%= @post.title %></p> <%= simple_format @post.body %> <%# app/views/post_mailer/admin_notice.text.erb %> A new post has been added! Here's the post: Title: <%= @post.title %> <%= @post.body %> We'll skip the tests for this mailer to keep this tutorial from getting too long. All you have to do now is call the mailer from the controller after a post has been created. # app/controllers/posts_controller.rb ... # POST /posts # POST /posts.json def create @post = Post.new(post_params) respond_to do |format| if @post.save PostMailer.admin_notice(@post).deliver_later format.html { redirect_to @post, notice: 'Post was successfully created.' } format.json{ render :show, status: :created, location: @post } else format.html { render :new } format.json{ renderjson: @post.errors, status: :unprocessable_entity } end end end ...

Page 8: Ruby on rails integration testing with minitest and capybara

From the Resource Library of Andolasoft.Inc | Web and Mobile App Development Company

We added only one line there to call the mailer. Now, let's run the tests again and see if they pass. rake # Running: .......... Finished in 0.975611s, 10.2500 runs/s, 15.3750 assertions/s. 10 runs, 15 assertions, 0 failures, 0 errors, 0 skips All the tests should pass, and now you have an application that is integration-tested end-to-end with Minitest and Capybara. Coming to an end of the lesson I am sure this article will give you a clear idea about ruby on rails application integration

testing using Minitest and Capybara. Share your thoughts with comments if I have missed

anything or if you want to know more.

http://www.andolasoft.com | http://blog.andolasoft.com

Call at 4086257188 or Email at [email protected]