简介
每个rails应用都包括三个环境:
生产环境
开发环境
测试环境
我们的测试就是跑在测试环境,如果测试涉及数据库,会在测试数据库进行操作。这样不会对生产环境和开发环境的数据造成影响。
我们先使用
rails new projects
命令来创建一个rails应用,默认会给我们创建一个projects目录,里面会包含一些默认的目录和文件。其中有一个文件夹test,里面将会放我们全部的测试相关文件。
$ ls -F test/
fixtures/ functional/ integration/ performance/ test_helper.rb unit/
fixtures文件夹
fixtures文件夹中的文件都是用yml为后缀,文件的格式都是yaml。
这里面的文件用来做什么呢?用来创建数据,创建测试用的数据。每个文件对应一张数据库表,文件的名称就是数据库表的名称,里面可以创建很多的数据,每一个数据对应表的一行数据。
文件中一般会写上每个字段的值,即使表的主键id是自增字段,也是可以指定的,如果不指定,系统会自动的分配。
users表结构
create_table :users do |t| t.string name t.datetime birthday t.string profession t.timestamps end
users.yml
david: id: 1 name: David Heinemeier Hansson birthday: 1979-10-15 profession: Systems development
user.rb
class User < ActiveRecord::Base attr_accessible :name, :birthday, :profession end
可以在单元测试和功能测试中使用这些数据,相当于是一些模拟数据。
这些yml文件如何使用呢?
在你进行单元unit测试和功能functional测试的时候,会自动加载fixtures文件夹中的yml文件,然后进行下面的三步:
删除测试数据库中已经存在的数据。
将fixtures中的数据加载到测试数据库表中。
然后将fixtures的数据放到一些变量中,在后面的测试就可以直接从变量访问这些数据。
写yml文件的时候有几个点需要注意。
首先,yml文件中模拟数据的属性对应的是数据表的字段,yml文件中的属性个数可以比数据表的字段个数少,但是不能多于数据表的字段个数,或者模拟一些数据库不存在的字段。
为什么?
因为会根据yml文件中模拟的属性生成insert语句的field,然后数据会插入测试数据库。如果发现数据库没有的字段,就会插入失败,很显然,因为insert中包含了数据库表没有的字段。但是你少几个没有关系,但是如果数据库有约束的话,那还是有可能有问题。例如:非空字段,你没有模拟,那就报错了。
其次,有时候我们还是会碰到这样一种情况。我们需要一些实体,而且需要这些实体具有一些属性,但是这些属性在数据库中没有对应的存储。
例如我们常用的用户实体,我们会有两个属性password和password_confirmation,用来注册的时候进行密码的验证,但是最终存入表格的密码是hash以后的值,不是用户在界面上出入的值。
class User < ActiveRecord::Base attr_accessible :email, :name, :password, :password_confirmation validates :password, :confirmation => true validates :password, :presence => true end
如果你想测试针对密码的validates是否生效,这时候password和password_firmation这两个字段就不能在yml文件中模拟,因为数据库中没有这两个字段。如果在模拟文件中包含这两个字段,会报错的,因为前面说过了,模拟数据会先插入测试数据库,不存在的字段会造成插入失败,测试就失败了。
这样的实体,在测试数据库不存在的字段的时候,如果需要模拟一些这样的实体,就不能再yml文件中模拟了,只能通过代码来模拟这样的实体。然后再进行其他测试。
user = User.new(:password => "123", :password_confirmation => "123")
访问fixtures中的数据。
users(:divid)
通过users(:divid)就可以访问到users.yml中模拟的divid的数据。通过users(:divid).name就可以访问模拟的name属性值。
总结
fixtures就是用来创建模拟数据的。
这些数据会被插入测试数据库,因此不能模拟数据库不存在的属性。
模拟数据可以在单元测试unit test和功能测试functional test中使用,通过表名(:模拟实体名)就可以访问模拟实体。users(:devid)就是一个user,然后users(:devid).name就可以访问name属性的值。
本文出自 “突破中的IT结构师” 博客,请务必保留此出处http://virusswb.blog.51cto.com/115214/1075385
查看本栏目更多精彩内容:http://www.bianceng.cn/Programming/project/
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数据库
, 数据模拟
, 文件
, 数据
, 测试
, 字段
模拟
rails 测试、rails 单元测试、rails 测试 理解、rails 测试数据、rails 自动化测试,以便于您获取更多的相关知识。