+1

RAILS UNIT TEST MODEL

Ruby on Rails 3 Testing

Artifacts for Testing Under test

  • Sub-directories Description

    • fixtures Contain testing data
    • functional Testing for individual controllers
    • integration Integration test for multiple controller
    • test_helper.rb Testing configuration unit Unit testing for models
    • Ruby on Rails Test Fixtures
  • Before running tests, Rails load the testing DB data with a pre-defined data called test fixtures

For unit and functional test, by default, load all data under texts/fixtures:

Remove any data from the DB table corresponding to the fixture Load the fixture data into the table Load the fixture data into a variable Test fixtures (accounts.yml)

account1:
  user_name: John Smith
  description: My user 1 description
  premium: false
  income: 100000
  ranking: 1.5
  fee: 9.99
  birthday: 2000-02-21
  login_time: 2011-02-21 18:07:36

account2:
  user_name: Tom Jones
  description: My user 2 description
  premium: false
  income: 80000
  ranking: 2.3
  fee: 9.99
  birthday: 1990-05-21
  login_time: 2011-02-21 18:07:36

Each fixture starts with a name followed by indented key/value pairs Data is separated by a blank space in the first column comment out the whole line Adding Ruby code in text fixture

<% base_income = 100000 %>
account1:
  income: <%= base_income * 0.9 %>
  login_time: <%= 10.days.ago.to_s(:db) %>

account2:
  income: <%= base_income * 0.85 %>
  login_time: <%= 15.days.ago.to_s(:db) %>

Accessing Test Fixture Data Access from a predefined variable


accounts(:account1)
accounts(:account1).income
Access from the DB

accounts(:account1).find

Create 1-to-Many Association Test Fixture Objects

Order composes of 1-to-many items

orders.yml

order1:
  order_name: book purchase

order2:
  order_name: cloth purchase
items.yml

o1_item1:
  item_name: ruby book
  order: order1

o1_item2:
  item_name: rails book
  order: order1

o2_item1:
  item_name: jeans
  order: order2

Create Many-to-many Association Test Fixture Objects

Vendors have many clients (or vice versa)

vendors.yml

sev:
  vendor_name: SEV enterprise

sco:
  vendor_name: SCO enterprise
clients.yml with the assocaition

uix:
  client_name: UIX LCC
  vendors: sco, sev

coco:
  client_name: Coco LCC
  vendors: sco

Ruby on Rails Unit Test

Edit

test/unit/vendor_test.rb

require 'test_helper'

class VendorTest < ActiveSupport::TestCase

   # Use fixtures data vendors and clients
   fixtures :vendors, :clients

   test "check data is valid" do

     vendor = Vendor.new

     # Assert not valid since vendor_name is required
     assert !vendor.valid?

     vendor.vendor_name = "E1"
     assert vendor.valid?

     # Compare value
     assert_equal vendor.vendor_name, "E1"

   end

   test "check associations" do
     # Retrieve data from the fixture
     sco = vendors(:sco)

     # Assert SCO should have 2 clients
     assert (sco.clients.length == 2)
   end

   test "check assoication data" do
     sco = vendors(:sco)
     uix = clients(:uix)

     # Get vendors of uix
     companies = uix.vendors

     # Check if sco is one of the vendors
     assert (companies.include? sco)

     coco = clients(:coco)

     # Assert coco vendors is sco
     assert_equal coco.vendors, [sco]

   end

end
  • Rails Assert Function Description
    • assert false Assert based on a boolean value
    • assert_not_nil assigns Assert controller has set the value of the named variable
    • assert_response :success for http 200, :redirect for 300-399, :missing for 404, :error for 500-599
    • assert_redirected_to Assert where the request redirect to
    • assert_difference Assert the row counts changed by n (Default 1)
    • assert_equal obj1, obj2 obj1 == obj2
    • assert_not_equal obj1, obj2 obj1 != obj2
    • assert_same obj1, obj2 obj1.equal?(obj2)
    • assert_not_same obj1, obj2 not obj1.equal?(obj2)
    • assert_nil obj obj.nil?
    • assert_not_nil obj not obj.nil?
    • assert_match regexp, string Match a regular expression
    • assert_no_match regexp, string Not match a regular expression
    • assert_in_delta expecting, actual, delta Actual is within the delta range of expected
    • assert_throws :SomeError {…} Expect SomeError is thrown
    • assert_raise ex1, ex2, … {…} Expect one of the exception is thrown
    • assert_nothing_raised ex1, ex2, … { …} Expect none of the exception in the list is thrown
    • assert_instance_of class, obj obj is an instance of class
    • assert_kind_of class, obj obj is kind of class
    • assert_respond_to obj, :some_method obj implement some_method
    • assert_operator obj1, operator, obj2 obj1.operator(obj2)
    • assert_valid record The model object is valid
    • assert_difference expressions, difference {…} The change of value in expression before and after the code block
    • assert_no_difference expressions {} Assert no different in the expression before and after the code block
    • assert_send array Execute a method flunk Fail a test
    • assert_recognizes Asserts that the routing of the given path is correct – Testing the Rails routing data
    • assert_generates Asserts that the generated path is correct – Testing the Rails routing data
    • assert_template Asserts that the request was handled by the right template file The assert methods above an optional “message”
    • assert false, "Failed"

Run the Unit test

Prepare the DB schema

rake db:migrate

Recreate the testing environment DB with db/schema.rb

rake db:test:load
For sub-sequent testing

rake db:test:prepare

Check for available migrations and warn the user Load the test schema Testing rake task

Rake Tasks Description

rake db:test:purge // Empty the test database
rake db:test:clone	// Recreate the test
database from current environment
rake db:test:clone_structure	// Recreate the test databases from the development environment
  • Run individual test or method
cd ctest
ruby unit/account_test.rb

ruby unit/account_test.rb -n test_register
  • Run all unit tests
rake test:units

If test “check assoication data” fails, the following message will be displayed


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí