When it comes to testing, all developers may have a similar opinion on how much they hate testing their application. However, the necessity of testing doesn’t need any explanation. Without testing, your application will not function as it should and would be riddled with bugs, this is why it becomes essential to test your apps before release.Ruby on Rails, on the other hand, is a popular framework which comes equipped with all the necessary tools required to make your application error free.
Currently, Test Driven Development(TDD) is a popular tool among the developers as it allows them to write test codes before writing any actual code. But, it doesn’t work out with every developer out there. In this article, we will focus on testing in Ruby on Rails. As testing is a big field, we will only cover the basics of RoR testing in this article including a few testing frameworks so that you can use during your app development process.
Testing in Ruby on Rails
Ruby on Rails has a proper environment to perform testing. If you are not familiar with how it works, we will cover the different aspects here. When you are coding your application, you can create the skeleton test code. You can run the Rails tests and figure out if your code is working as intended or not.
How to Setup Rails for Testing
It is very easy to setup Rails for testing. You don’t have to do anything initially as Rails will set up the test directories for you when you create your project using the rails new app_name command.
It creates three main directories: mailers, helpers, and models for mailers, helpers, and models respectively.
Fixtures allow you to load test data and organize them. They are stored in the fixtures directory.
Other important files include test_helper.rb which contains the test configuration. You can change it according to your requirement.
Understanding the test environment
To get started, you need to understand the test environment. You can run the test environment in either test, development, and production mode. It is advised to run your test environment in test mode. If you wish to change the test environment, you need to change the value of RAILS_ENV in config/environments/test.rb
Ruby on Rails has a rich ecosystem. It comes with different gems and libraries which can be replaced in your application. The default testing framework that you will get on RoR is MiniTest. Using MiniTest is easy as most of the necessary components including test stubs are created during the model creation process.
$ bin/rails generate model article title:string body:text ... create app/models/article.rb create test/models/article_test.rb create test/fixtures/articles.yml ...
If you decide to look into the test stub, it will look something like the image below:
require 'test_helper' class ArticleTest < ActiveSupport::TestCase # test "the truth" do # assert true # end End
As you can see from the above code, we call in the test_helper.rb that loads the default configuration. Also, ArticleTest inherits ActiveSupport:: TestCase to define a test case.
The code within the method is where your logic for testing goes in. The assert true is assertion line which checks if the value of the expression or object is true or not. It can be used in many ways including checking if a value is NIL or not, or does the password has a certain length associated with it.
RSpec – A better alternative
RSpec is a good alternative to MiniTest. MiniTest is an excellent testing framework but lacks readability and usability. Also, the choice of framework completely depends on the developer and what his preference is. Let’s look into an example of how the RSpec code looks like.
describe “the test” do it “is a success” do expect(1).to eq(1) end end
It uses words such as “it” and “describes” making it more readable and easy to write.
Other than MiniTest and RSpec, you can also try out Capybara. Capybara provides more real-world scenarios to test your application. It can be used to emulate user behavior such as form filling, clicking, etc. Check out one of the examples which is shown in the docs of Capybara.
describe “the signin process”, :type => :feature do before :each do User.make(email: ‘[email protected]’, password: ‘password’) end it “signs me in” do visit ‘/sessions/new’ within(“#session”) do fill_in ‘Email’, with: ‘[email protected]’ fill_in ‘Password’, with: ‘password’ end click_button ‘Sign in’ expect(page).to have_content ‘Success’ end end
Understanding the Testing Types
You can test components of your Rail application by using different test types. You can do the Unit Model test, View tests, and Controller tests. On top of that, you can also use Feature Test which is used to test app features in a more unified manner.
Let’s try to understand them one by one.
Unit/Model Tests are focused on dealing with the logic defined in Model. These tests check the CRUD operations and also another form of assertions or validations.
Controller tests are aimed to test conditional logic within your app. This means that you can test user type, Models behavior, request type and so on. Controller tests also take more time to run compared to Model Tests.
View Tests are aimed to test visual aspects of your app. You can use View Tests to send messages to the app front-end and check whether it is working fine or not. You can act as a user or an admin, and check usability access as well.
Feature Tests enable you to check your whole application. You can use both Capybara and RSpec to write Feature Tests.
Final Thoughts: –
It is important to understand that you cannot ignore testing your application. Ruby on Rails has all the necessary tools, techniques, and libraries that let you do whatever you want. If you are new, this guide will help you get started. Also, don’t forget to share your thoughts in the comment section below.