背景:
明星和管理员,多对多
明星和管理员,多对多
class Admin < ActiveRecord::Base
has_and_belongs_to_many :stars
end
has_and_belongs_to_many :stars
end
class Star < ActiveRecord::Base
......
has_and_belongs_to_many :admins
......
end
......
has_and_belongs_to_many :admins
......
end
共有3个表:admins,stars,admins_stars,关联表admins_stars只有两个字段:star_id,admin_id
以一个测试用例作为说明
开头:
require File.dirname(__FILE__) + '/../test_helper'
class AdminTest < Test::Unit::TestCase
fixtures :admins,:agents,:stars,:admins_stars
def setup
@admin = Admin.find(1)
end
....
class AdminTest < Test::Unit::TestCase
fixtures :admins,:agents,:stars,:admins_stars
def setup
@admin = Admin.find(1)
end
....
测试读:
def test_read
assert_equal 1, @admin.id
assert_equal "1",@admin.nick_name
assert_equal 2,@admin.stars.length
assert_equal "谭咏麟",@admin.stars[0].name_cn
end
assert_equal 1, @admin.id
assert_equal "1",@admin.nick_name
assert_equal 2,@admin.stars.length
assert_equal "谭咏麟",@admin.stars[0].name_cn
end
测试新增:
def test_create
new_admin = Admin.new
new_admin.login_name="aa"
new_admin.nick_name="bb"
new_admin.star_ids=[2,3]
new_admin.save
new_admin = Admin.find(new_admin.id)
assert_equal 2,new_admin.stars.length
end
new_admin = Admin.new
new_admin.login_name="aa"
new_admin.nick_name="bb"
new_admin.star_ids=[2,3]
new_admin.save
new_admin = Admin.find(new_admin.id)
assert_equal 2,new_admin.stars.length
end
测试修改:
def test_update
assert_equal 2,@admin.stars.length
assert_equal 1,@admin.stars[0].id
assert_equal 2,@admin.stars[1].id
@admin.star_ids=[3]
@admin.nick_name="aa"
@admin.save
@admin = Admin.find(1)
assert_equal 1,@admin.stars.length
assert_equal 3,@admin.stars[0].id
end
assert_equal 2,@admin.stars.length
assert_equal 1,@admin.stars[0].id
assert_equal 2,@admin.stars[1].id
@admin.star_ids=[3]
@admin.nick_name="aa"
@admin.save
@admin = Admin.find(1)
assert_equal 1,@admin.stars.length
assert_equal 3,@admin.stars[0].id
end
测试删除:
def test_delete
assert_equal 4 , Admin.find(:all).length
Admin.destroy [1,2]
assert_equal 2 , Admin.find(:all).length
end
assert_equal 4 , Admin.find(:all).length
Admin.destroy [1,2]
assert_equal 2 , Admin.find(:all).length
end
注意:
Admin.destroy [1,2]是一条条删除纪录
Admin.delete[1,2]批量删除,但在本例中会违反外键约束,delete看来比较适合独立的表的批量删除