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> 

参考链接:


共收到 0 条回复


评论:

忘记密码?
其他账号登录: QQ登录

回到顶部
到达底部