Testing In Rails: Introduction and Creating Test Data
Even if you write code considering every case in mind there is always a chance that your code contains bugs. So the best way of writing a code that contains least number of bugs is writing a code along with its test cases. In this blog I am going to give you a brief idea about how we can write test cases in rails application without using any major third party software.
Rails has a built in framework of test cases that makes it really very easy to write cases. Once you create any component in rails including either application, controllers or models using its generators, it automatically creates supported test files, where you can write your test cases. For example if you run
> rails new MyTestingApp
# Along with the whole project directory it will also create a section for test like:
# Similarly during controllers:
> rails g controller welcome
# Along with controller and view folder it will create the following section too:
Thus we can see that as soon as we create an application, rails promotes us to write test cases. As we all know rails has different environment for running the application. i.e. Development, Production and Testing. So the testing enviroment is run while running the test cases. It also has separate database that can be defined inside the config/database.yml. A different database allows you to freely test the application without having any tension related to data loss or misuse. If you closely look at the test folder it will have different components that are present in your application. i.e. controllers, helpers, mailers, test_helper.rb, fixtures, integrations and models. In these files test_helper.rb is used for storing the default configurations for all the other files.
Creation of Test Data:
Creation of test data can be done using different techniques, one of them that are by default present with your application is using fixtures, which are used for storing data. They are actually a YAML files that can store some test data, they are associated with models and used to populate data from yaml files to tables before you run the test cases. As soon as you create a model using generator, an associated fixture file is generated with the model. i.e.
> rails g model MyProduct title:string description:string price:string
If we open my_products.yml, we can see it already created two test records for my_products table.
Now when you run a test cases it will actually perform these 3 tasks: a) Remove all the existing data from the table b) Import the data from the yaml file into the table c) Store the fixture data in a table to use it directly. They can also be accessed like an active record object:
#=> will return an object of MyProduct with name one
One more way of creating test data is using factory_girl_rails gem, that is actually a replacement for fixture data. It provides a much easy of creating data just like you do with models. For using it you need to add the gem file in the test group in your Gemfile like this:
group :test do
# after that run bundle
A sample factory_girl file is like this:
factory :my_product do
description "Mobile Phone"
Now to create a my_product you can simply write:
product = build(:my_product)
#This will initialize a MyProduct object
product = create(:my_product)
#This will create a MyProduct object
For more information regarding the use of factory_girl and its configuration you can go through the link Factory Girls Configurations.
Thus we are done with creating sample data in test cases, In the next chapters we will see how we can test our models using unit test cases and also will talk about testing the controller, links for them are given below:
Testing In Rails: Unit Testing In Models
Testing In Rails: Functional Testing For Controllers