rails测试之固件使用
蔡源茂 | 创建:2018-05-31 | 最后更新:2018-05-31 | 1367次阅读
1. 什么是固件
我们在写rails测试的时候,基本都会用到测试数据。rails在测试数据上提供了固件支持。固件参考API
固件位于rails项目根目录的 /test/fixtures,以模型名命名的yaml文件。例如:users.yml
#users.yml
guest:
username: guest
email: guest_email@test.com
name: guest
encrypted_password: 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08 #=> test
provider: nil
uid: nil
role: guest #=>这里的健role是另一个数据库表对应的模型名
固件中的数据,会在在执行rails test
时,自动插入test环境的数据库中,供测试代码使用,yml文件有变化时,自动更新数据库。
2. 怎么使用定义好的固件
从yml文件的结构中,大家很容明白,yml是以类似json 键值对的形式保存数据的。.一级键名为数据索引,二级键名为数据库表的列名。
例如上段users.yml文件,将会在 users表中,生成 username列为guest
,email列为 guest_email@test.com
的数据条目
那么我们在测试用怎么使用这些固件定义好的数据呢?请看下面这段代码实例
require 'test_helper'
class SessionsControllerTest < ActionDispatch::IntegrationTest
setup do
@guest = users(:guest) #=>我们通过固件名称`user`跟一级键名`guest`来获取该数据对应的数据库模型实例
@user_info={
username: @guest.username,
email:@guest.email,
password: 'test',
password_confirmation: 'test'
}
end
test "should new" do
get new_user_session_url
assert_response :success
end
end
我们通过固件名称user
跟一级键名guest
来获取该数据对应的数据库模型实例
也就是users(:guest)
等同于User.find()
获得的user模型实例
3. 固件怎么体现模型关联
我们再看固件users.yml中role: guest
这个键值队对。其中表users中并未定义role列。 而是在user模型中定义了与role模型的关联belongs_to :role
。因此,我们可以在users.yml固件中,以模型role为键,roles.yml固件中的一级键guest做role的值。rails自动会帮我们在数据库做表关联
#roles.yml
guest: #=> 在固件users.yml中,作为键role的值,rails自动会帮我们在数据库做表关联
name: guest
describe: guest
admin: false
publish_articles: false
publish_comments: true
最后我们一起来看下rails test
执行后,数据库中的数据。
我们可以看到user表中的 username为guest的数据条目,自动关联了role表中的name为guest的id
mysql> select id ,username,role_id from users;
+-----------+----------+-----------+
| id | username | role_id |
+-----------+----------+-----------+
| 135138680 | admin | 135138680 |
| 206669143 | user1 | 227792459 |
| 227792459 | user | 227792459 |
| 358143215 | user2 | 227792459 |
| 750230071 | guest | 750230071 |
+-----------+----------+-----------+
5 rows in set (0.02 sec)
mysql> select id,name from roles;
+-----------+-------+
| id | name |
+-----------+-------+
| 135138680 | admin |
| 227792459 | admin |
| 750230071 | guest |
+-----------+-------+
3 rows in set (0.00 sec)
mysql>
参考链接: