rails中针对date类型的扩展。
ActiviSupport中包含一些工具类,以及一些对标准类库的扩展。 ActiveSupport的内容都是是独立于rails的,因此也可以在非rails的ruby项目中使用。 今天介绍一些针对Array的扩展。
本文首先会介绍如何在应用中添加邮件发送程序,然后再介绍一些邮件发送程序相关的测试该如何进行,以及应该测试哪些内容。 关于邮件测试有下面几个目的 邮件正在被处理,创建或者发送。 邮件的内容是正确的,包括标题,发送人,body等。 在正确的时间发送了正确的邮件。 可以从两个方向来测试邮件,一个是单元测试,一个是功能测试。在单元测试中,我们在一个隔离的环境中运行邮件程序,内容是受控的,然后和模拟数据比较输出的内容。在功能测试中,我们在controller和model中正确的使用邮件发送程序,测试在正确的时间发送了正确的邮件。
今天来介绍一些杂七杂八的测试知识,但是它们是不能错过的。
今天我们来熟悉一下rails的集成测试integration test。 集成测试主要是测试多个controller之间的交互,以及测试应用中比较重要的工作流程,验证这些工作流程是否符合预期的设想。 不像单元测试和功能测试,是自动添加的。集成测试是需要我们手动添加的,rails提供了一个命令, rails generate integration_test , 通过命令就可以在test/integration文件夹创建集成测试。
assert_difference的英文解释是 Test numeric difference between the return value of an expression as a result of what is evaluated in the yielded block. 直译的话就是 测试两个数值的区别。 哪两个数值呢,就是expression的数值。怎么变成一个了?不要着急,一个是block执行之前,一个是block执行之后。 意译一下就是 比较expression的数值在block执行前后的差,看这个差是否是difference 参数指定的值,这个参数是个可选参数,默认值是1。 也可以理解为,block执行之后的expression值 - block执行之前的expression值,看这个差值是否等于difference 指定的值,默认差值为1。assert_no_difference(expression, message = nil, &block) 用来测试block前后,expression的数值是否没有发生变化。
之前我们介绍过,rails的功能测试针对的是controller,测试controller的action是否正确的执行。 测试的内容主要是: 测试请求是否正确。 测试用户是否跳转到正确的页面。 测试用户是否验证成功。 测试响应中是否包含了正确的对象。 测试在view中是否给用户显示了适当的信息。
上一篇我们介绍了factory-girl,这是一个很好的工具,可以用来替代rails中的fixtures,用来生成模拟数据。 它直观,易读,易读就易维护。最重要的一点是,它是面向model的,面向业务的,面向应用的,而fixtures模拟的数据是面向数据库的。但是我们的单元测试,功能测试,甚至将来要介绍的集成测试,都是面向业务的,从业务角度出发的测试,测试系统是否满足业务需求。所以好处显而易见了,相信大家在使用了以后会有一点感触。
使用fixtures有几个不利的因素,使得他们处于不利的位置。 最主要的一个因素是,这些fixtures描述的数据和测试他们的行为是分开的,在不同的文件中。使用这些模拟数据,我们需要依赖于fixtures文件,这些文件很难阅读,维护不便。因此很多时候我们使用factory-girl替代fixtures来创建模拟数据。
之前的博客介绍了一些rails测试相关的知识。测试文件的位置,测试的类型,测试常用命令,以及可用的一些资源,以及如何利用fixtures生成模拟数据。 今天我们来实际的写一下单元测试,用到的知识主要是fixtures和unit test。fixtures用来模拟数据,unit test就是我们今天的主角-单元测试。 今天的代码将以blog项目为背景,为这个项目写一些单元测试。 这个项目的代码可以在https://github.com/woaigithub/blog获取到,而且项目已经部署到http://42.121.5.68:10000/,大家也可以直接在部署的生产环境上面写自己的博客。 项目使用ruby on rails开发,开发及测试环境使用sqlite3作为数据存储,生产环境使用mysql作为数据存储。 单元测试 rails的单元测试主要针对model,model是我们的业务实体。单元测试主要测试model的validates,以及model的业务规则,测试经过业务规则的执行,我们的model的变化,就是model的属性值,是否符合规则的描述,是否变为预期的值。
在rails中,针对单个controller中的各个action进行的测试,叫做功能测试。controller处理web的请求,将请求的响应render到view中。
单元测试针对model,主要是测试model中的业务规则,测试model中的验证validates规则。 单元测试的文件存放在test/unit文件夹,针对user的model的单元测试文件是user_test.rb。
fixtures就是用来创建模拟数据的。 这些数据会被插入测试数据库,因此不能模拟数据库不存在的属性。 模拟数据可以在单元测试unit test和功能测试functional test中使用,通过表名(:模拟实体名)就可以访问模拟实体。users(:devid)就是一个user,然后users(:devid).name就可以访问name属性的值。
本章我们从一个cucumber的逻辑错误开始。从外部的cucumber周期,转向内部的rspec周期。 本章我们使用RSpec来完成了一个red/green/refactor的周期。 这就是BDD的周期。从外到里的驱动开发,从使用cucumber描述的业务scenario,到使用rspec描述的内部对象。
我们先在.feature文件中写一个feature的scenario,已经scenario的steps,然后在step_definitions中定义Given,When,Then,然后在通过测试cucumber .feature文件来驱动我们编写实现代码。 当目前为止,我们已经学会使用cucumber从外部描述一件事。在接下来的章节中,我们将会进行从外到里的工作方式,使用RSpec来驱动单个对象的外部行为。
缩小用户故事的范围,保证留下的用户故事和一次发布的目标匹配即可。 为一个interation选择用户故事,不要再一个interation中放入太多的用户故事,不要希望一个interation来完成所有的用户故事。 验收准则,我们通过写cucumber feature来描述用户故事。我们在迭代计划会议期间做这件事,使用这些来确定和修改我们的预估。 scenario outline,使得我们减少大量的重复,更加的DRY。
TDD(Test-Driven Development)测试驱动开发。 在编写代码之前先编写一个测试,这时候测试是失败的,red,因为还没有写对应的实现代码。然后开始编写实现的代码,然后跑刚才写的测试,直到测试通过,green。 然后我们就重构我们的代码,refactor,然后再次跑我们的测试,green重构成功,red重构失败。失败也没有关系,继续重构。而且有了测试的保证,我们可以很放心的重构。 TDD偏激的做法是,在没有编写测试之前,绝不写一行代码。软件开发,测试先行。用测试来驱动开发。 BDD(Behavior-Driven Development)行为驱动开发。 在应用级别,项目的利害关系人通常不关心数据被持久化到什么地方,什么格式,什么存储类型。当然不是说他们不关心数据,而是说他们更关心他们保存的数据,在他们需要的时候可以获取出来。
Rails开发细节《九》Rails的测试
ckeditor是一款嵌入网页的富文本编辑器,是一种所见即所得的编辑器,就是你编辑的时候看见的样式,就是将来显示的样式。 自带了常见的文本编辑功能。
Rails开发中可能会用到的组件,Ruby && Rails开发资源。
时区以及日期的格式化是每个程序员的必修课,就像字符串的各种处理一样重要,而且使用频率很高。 rails默认就是写入utc时间,然后读取也是utc时间。 设置config.time_zone只能保证写入数据库的时间是local,就是保证创建对象的时候created_at和updated_at使用设置的本地时间。 但是读出来的时候还是有可能是utc时间,有可能需要在界面上转换的。 rails推荐使用utc时间,这样就统一了,只是在界面显示的时候格式化为本地时间。 对于任何应用来说,遇到时区问题,都应该考虑语言本身和存储本身,甚至是操作系统本身的时区设置和一些默认值,这样才能最终较好的解决时区问题。
new_post_url 产生的路径是绝对路径,http://xxx/posts/new。 new_post_path 产生的路径是相对路径,相对于根目录的路径,/posts/new。
Routing路由
从安全角度来讲,文件上传要严格控制路径,权限,以及上传的类型。 路径,就是文件在服务器的保存路径,最好是单独路径,不要放在根目录,规划好文件夹,还要做好重命名,因为上传的人不知道服务器上面是不是存在同名的文件,这就涉及文件实际的名称和用户需要看到的文件名的映射。 权限,就是上传路径给用户的权限,最好不要有执行权限,只有读写权限就可以了。有必要的话,需要划分用户文件夹来区分权限。保留一个公共文件夹。等等,根据情况而定。 上传的类型,上传文件肯定和一个场景相关,一个场景可能只需要一类文件,比如文档场景,图片场景。最好在不同的场景控制不同的文件类型。执行文件要严格控制。
很多问题的标题就是报错之后日志中记录的错误信息。 apache的日志在/var/log/apache2/目录中,error.log。当然,也有可能在其他位置。如果是下载httpd,编译安装的话,有可能在/usr/local/apache目录中。 nginx的日志在/opt/nginx/log/中,也是error.log。也是有可能在其他位置的,例如安装目录或者是/var/log/nginx/中。
Rails常用命令
看过本文之后,你应该熟悉下面的内容: 所有显著的对策。 rails中session的概念,其中存放的内容,常见的攻击手段。 rails中大量的分配问题。 在提供管理接口的时候,你不得不关注的一些事情。 如何管理用户:登陆,退出,在各个层面的攻击方法。 流行的注入攻击方法。
Rails开发细节《七》ActiveRecord Associations关联
Rails开发细节《六》ActiveRecord Validationa and Callbacks验证和回调
Rails开发细节《五》Migrations 数据迁移
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号