Rails测试《一》fixtures简介

简介

每个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 自动化测试,以便于您获取更多的相关知识。

时间: 2024-09-07 02:12:19

Rails测试《一》fixtures简介的相关文章

Rails测试《六》实战单元测试

用factory-girl替换fixtures来创建模拟数据2 上一篇我们介绍了factory-girl,这是一个很好的工具,可以用来替代rails中的fixtures,用来生成模拟数据. 它直观,易读,易读就易维护.最重要的一点是,它是面向model的,面向业务的,面向应用的,而fixtures模拟的数据是面向数据库的.但是我们的单元测试,功能测试,甚至将来要介绍的集成测试,都是面向业务的,从业务角度出发的测试,测试系统是否满足业务需求.所以好处显而易见了,相信大家在使用了以后会有一点感触.

Rails测试《五》实战单元测试

用factory-girl替换fixtures来创建模拟数据 fixtures 在前面我们介绍了,rails的测试系统默认使用fixtures来创建模拟数据,这些数据以yaml的格式书写,放在db/fixtures文件夹中,每个model都有一个对应的文件,test/fixtures/users.yml. 在测试启动的时候这些fixtures中的数据会加载到测试数据库,并且加载到变量中,供单元测试和功能测试使用. 使用fixtures有几个不利的因素,使得他们处于不利的位置. 最主要的一个因素是

Rails测试《四》实战单元测试unit test

之前的博客介绍了一些rails测试相关的知识.测试文件的位置,测试的类型,测试常用命令,以及可用的一些资源,以及如何利用fixtures生成模拟数据. 今天我们来实际的写一下单元测试,用到的知识主要是fixtures和unit test.fixtures用来模拟数据,unit test就是我们今天的主角-单元测试. 今天的代码将以blog项目为背景,为这个项目写一些单元测试. 这个项目的代码可以在https://github.com/woaigithub/blog获取到,而且项目已经部署到htt

Rails测试《十》不能错过的杂七杂八

今天来介绍一些杂七杂八的测试知识,但是它们是不能错过的. 首先来介绍一下常用的测试命令 rake test 运行包括单元测试.功能测试和集成测试在内的所有测试. rake test:units 运行所有的单元测试. rake test:functionals 运行所有的功能测试 rake test:integration 运行所有的集成测试. rake test:recent 运行最近修改过的测试. rake test:uncommited 运行所有未提交的测试.支持svn和git. setup

Rails测试《三》功能测试functional test

功能测试functional test 在rails中,针对单个controller中的各个action进行的测试,叫做功能测试.controller处理web的请求,将请求的响应render到view中. 功能测试包括的内容 web请求是否成功? 用户是否被引导进入正确的页面? 用户是否成功的验证? 响应的模板中是否包含了正确的内容? 在给用户的view中是否显示了适当的内容? 功能测试分解 在使用rails g scaffold post或者rails g controller命令之后,会创

Rails测试《九》集成测试integration test

开场白 今天我们来熟悉一下rails的集成测试integration test. 简介 集成测试主要是测试多个controller之间的交互,以及测试应用中比较重要的工作流程,验证这些工作流程是否符合预期的设想. 不像单元测试和功能测试,是自动添加的.集成测试是需要我们手动添加的,rails提供了一个命令 rails generate integration_test 通过命令就可以在test/integration文件夹创建集成测试. $ rails generate integration_

Rails测试《二》单元测试unit test

单元测试 单元测试针对model,主要是测试model中的业务规则,测试model中的验证validates规则. 单元测试的文件存放在test/unit文件夹,针对user的model的单元测试文件是user_test.rb. 常用命令 从db/schema.rb中同步测试数据库的结构. 在数据库结构变化之后,就需要执行这个命令,保持测试数据库的结构和最新的数据库结构一致. rake db:test:prepare 还有其他的一些相关命令. 如何编写并进行单元测试 在使用rails g mod

Rails测试《十一》添加邮件发送程序及测试邮件发送程序

讲到测试邮件发送程序,我们首先要让系统可以发送邮件.我们先来给系统添加发送邮件的功能. Action Mailer in Rails 3是一个不错的视频教程,大家可以参考. 还有就是http://guides.rubyonrails.org/action_mailer_basics.html中更加详细的介绍. 添加邮件发送程序 发送邮件要保证我们有目标邮箱,所以呢,我们的用户要有一个属性:email. 还是拿我的blog项目作为练习项目. 我们在用户注册的时候给他发一封邮件. 首先我们创建一个初

Rails测试《八》实战功能测试functional test2

今天继续我们的功能测试实战. 项目还是:blog,大家可以从github或者gitcafe中获取项目源码. 先来介绍一个断言 assert_difference(expression, difference = 1, message = nil, &block) http://api.rubyonrails.org/classes/ActiveSupport/Testing/Assertions.html中比较详细的介绍. 再一次强烈推荐http://api.rubyonrails.org/,还