RAILS UNIT TEST MODEL
Bài đăng này đã không được cập nhật trong 9 năm
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