简介

每个rails应用都包括三个环境:

  • 生产环境
  • 开发环境
  • 测试环境

我们的测试就是跑在测试环境,如果测试涉及数据库,会在测试数据库进行操作。这样不会对生产环境和开发环境的数据造成影响。

我们先使用

  1. rails new projects

命令来创建一个rails应用,默认会给我们创建一个projects目录,里面会包含一些默认的目录和文件。其中有一个文件夹test,里面将会放我们全部的测试相关文件。

  1. $ ls -F test/
  2. fixtures/       functional/     integration/   performance/  test_helper.rb  unit/

fixtures文件夹

fixtures文件夹中的文件都是用yml为后缀,文件的格式都是yaml。

这里面的文件用来做什么呢?用来创建数据,创建测试用的数据。每个文件对应一张数据库表,文件的名称就是数据库表的名称,里面可以创建很多的数据,每一个数据对应表的一行数据。

文件中一般会写上每个字段的值,即使表的主键id是自增字段,也是可以指定的,如果不指定,系统会自动的分配。

users表结构

  1. create_table :users do |t|
  2. t.string name
  3. t.datetime birthday
  4. t.string profession
  5. t.timestamps
  6. end

users.yml

  1. david:
  2. id: 1
  3. name: David Heinemeier Hansson
  4. birthday: 1979-10-15
  5. profession: Systems development

user.rb

  1. class User < ActiveRecord::Base
  2. attr_accessible :name, :birthday, :profession
  3. end

可以在单元测试和功能测试中使用这些数据,相当于是一些模拟数据。

这些yml文件如何使用呢?

在你进行单元unit测试和功能functional测试的时候,会自动加载fixtures文件夹中的yml文件,然后进行下面的三步:

  • 删除测试数据库中已经存在的数据。
  • 将fixtures中的数据加载到测试数据库表中。
  • 然后将fixtures的数据放到一些变量中,在后面的测试就可以直接从变量访问这些数据。

写yml文件的时候有几个点需要注意。

首先,yml文件中模拟数据的属性对应的是数据表的字段,yml文件中的属性个数可以比数据表的字段个数少,但是不能多于数据表的字段个数,或者模拟一些数据库不存在的字段。

为什么?

因为会根据yml文件中模拟的属性生成insert语句的field,然后数据会插入测试数据库。如果发现数据库没有的字段,就会插入失败,很显然,因为insert中包含了数据库表没有的字段。但是你少几个没有关系,但是如果数据库有约束的话,那还是有可能有问题。例如:非空字段,你没有模拟,那就报错了。

其次,有时候我们还是会碰到这样一种情况。我们需要一些实体,而且需要这些实体具有一些属性,但是这些属性在数据库中没有对应的存储。

例如我们常用的用户实体,我们会有两个属性password和password_confirmation,用来注册的时候进行密码的验证,但是最终存入表格的密码是hash以后的值,不是用户在界面上出入的值。

  1. class User < ActiveRecord::Base
  2. attr_accessible :email, :name, :password, :password_confirmation
  3. validates :password, :confirmation => true
  4. validates :password, :presence => true
  5. end

如果你想测试针对密码的validates是否生效,这时候password和password_firmation这两个字段就不能在yml文件中模拟,因为数据库中没有这两个字段。如果在模拟文件中包含这两个字段,会报错的,因为前面说过了,模拟数据会先插入测试数据库,不存在的字段会造成插入失败,测试就失败了。

这样的实体,在测试数据库不存在的字段的时候,如果需要模拟一些这样的实体,就不能再yml文件中模拟了,只能通过代码来模拟这样的实体。然后再进行其他测试。

  1. user = User.new(:password => "123", :password_confirmation => "123")

访问fixtures中的数据。

  1. users(:divid)

通过users(:divid)就可以访问到users.yml中模拟的divid的数据。通过users(:divid).name就可以访问模拟的name属性值。

总结

  • fixtures就是用来创建模拟数据的。
  • 这些数据会被插入测试数据库,因此不能模拟数据库不存在的属性。
  • 模拟数据可以在单元测试unit test和功能测试functional test中使用,通过表名(:模拟实体名)就可以访问模拟实体。users(:devid)就是一个user,然后users(:devid).name就可以访问name属性的值。

本文转自 virusswb 51CTO博客,原文链接:http://blog.51cto.com/virusswb/1075385,如需转载请自行联系原作者

Rails测试《一》fixtures简介相关推荐

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

    单元测试 单元测试针对model,主要是测试model中的业务规则,测试model中的验证validates规则. 单元测试的文件存放在test/unit文件夹,针对user的model的单元测试文件 ...

  2. 【Android 电量优化】电量优化 ( 耗电量测试 | Battery Historian 简介 | apt 源更新 | Docker 安装 | Battery Historian 安装 )

    文章目录 一.耗电量测试 二.Battery Historian 简介 三.Docker 简介 四.更新 apt 源 五.安装 Docker 六.安装 Battery Historian 七.访问电量 ...

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

    讲到测试邮件发送程序,我们首先要让系统可以发送邮件.我们先来给系统添加发送邮件的功能. Action Mailer in Rails 3是一个不错的视频教程,大家可以参考. 还有就是http://gu ...

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

    今天来介绍一些杂七杂八的测试知识,但是它们是不能错过的. 首先来介绍一下常用的测试命令 rake test 运行包括单元测试.功能测试和集成测试在内的所有测试. rake test:units 运行所 ...

  5. python测试工具--nose简介

    声明: 本博客欢迎转发,但请保留原作者信息! 新浪微博:@孔令贤HW: 博客地址:http://blog.csdn.net/lynn_kong 内容系本人学习.研究和总结,如有雷同,实属荣幸! 使用p ...

  6. Go:测试库testify简介

    文章目录 简介 1. assert 2. mock 3. suite 示例 例子1:使用assert 例子2:使用require 小结 简介 testify可以说是最流行的(从 GitHub star ...

  7. Go:基于BDD的测试框架 Ginkgo 简介及实践

    文章目录 简介 1. TDD 2. BDD 3. Ginkgo 一.Ginkgo实践 1. 安装Ginkgo 2. 使用 二.高级用法 1. 标志 2. 并发 3. goroutine 4. Desc ...

  8. 移动App自动化测试1---自动化测试、操作系统简介

    1.背景         用户对App产品的质量和用户体验要求越来越高,因此很多互联网企业也因此开始对移动端产品质量越来越重视.但是App产品不断迭代更新,给测试人员也增加了测试工作量,特别是大量繁琐 ...

  9. 压力测试工具Ab简介

    Apache安装包中自带的压力测试工具 Apache Benchmark(简称ab) 简单易用,这里就采用 ab作为压力测试工具了. 1.独立安装 通过 yum-utils中的yumdownload  ...

最新文章

  1. PHP:第一章——PHP中的魔术常量
  2. 2-51单片机ESP8266学习-AT指令(开发板51单片机自动冷启动下载原理)
  3. 【图像】直方图均衡化
  4. python 打包 无需安装运行环境_无需Python环境,小白也可以运行的抢票程序
  5. 【HibernateHibernate实体关系映射——双边的多对一、一对多关系
  6. Circle HDU - 6550 (数学)
  7. python牛顿法计算平方根_常用的平方根算法详解与实现
  8. 理论 | 分库分表需要考虑的问题及方案
  9. 深入理解对象的数据属性与访问器属性及属性间相互转换
  10. 工业基础类IFC—概述
  11. 语音播放与录音 (五分钟学会用 非常全面)
  12. Educode--头歌 《软件工程》实验作业6-软件开发计划
  13. VS的Qt界面预览和QtCreator的界面预览快捷键
  14. android bugly qq,Android如何快速集成腾讯Bugly
  15. 获得中国行政区划接口
  16. 以太网 STP临时环路的产生、STP BPDU的转发过程、根桥故障案例分析。
  17. 高德地图js API实现多点标记marker,多点marker移除和鼠标滑入标点显示提示框
  18. Python中int、str、bytes相互转化,还有2进制、16进制表示,你想要的都在这里了
  19. geojson 河流_如何做高大上的城市肌理分析图?
  20. 论文引用率为零是什么情况?

热门文章

  1. if函数中的android,java - 我需要帮助将IF语句方法更改为Android Studio中的SWITCH情况 - 堆栈内存溢出...
  2. chgrp r mysql ._mysql操作命令
  3. zippo油和zorro油的区别_干式和油侵式变压器的概念和区别
  4. oracle full outer join,oracle 内连接(inner join)、外连接(outer join)、全连接(full join)...
  5. python常考题_python面试总结2(函数常考题和异常处理)
  6. java 什么时候进行垃圾回收_Java中垃圾回收有什么目的?什么时候进行垃圾回收?...
  7. adams建立一绳索不带滑轮_建立企业精益供应链,必须先解开现有绳索 系列(一)...
  8. 第22届清华大学电子设计大赛决赛
  9. 怎么交换两个字符串_leetcode1202_go_交换字符串中的元素
  10. 队列判空_数据结构与算法——队列的C语言实现