rails将类常量重构到数据库对应的表中之二
来源:互联网 发布:js防水涂料多少钱一桶 编辑:程序博客网 时间:2024/06/14 10:26
在博文之一中我们将Order中的常量重构到了数据库的表中,也做了一些测试,貌似一切都很完美.可是...梦魔还未开始啊!我们少做了一步测试,就是rake test!
结果惨不忍睹,所有测试都是E,全部出错!提示payment_types表中找不到字段type!这个很好解决,检查test/fixtures/payment_types.yml文件,发现其中字段名称还是type,将其改为pay_type,则所有E都消失鸟.
可是噩梦还未结束!仍然有2个F!检查发现无论是在Order中还是Order控制器中动态赋予的:PaymentType.all.map {|type|type.pay_type}在rake test中统统都为nil值,而且在测试开头的setup中设置也不行!如果还原Order中的:
PAYMENT_TYPES = ["Check","Credit card","Purchase order"]
则没有问题.不太了解test背后的机制,为毛不能应用动态的值呢?还是百思不得其"姐"中...
思来想去,想要放弃又不太甘心啊!静下心来重新理一下思绪吧:
首先test测试用的是test数据库中的内容,如果正常流程执行没有问题而测试过不去的话,是不是test数据库里面有问题呢?抱着试一试的心态,用sqlite3 test.sqlite3打开test数据库,检查里面的payment_types表内容,果真没有东东啊!难怪出现上面字段都为nil的情况啊!下面的就是如何在test的数据库中添加pay_type的问题了.
首先第一次尝试:在seeds.rb中增加如下代码:
PaymentType.delete_allPaymentType.create(pay_type:'Check')PaymentType.create(pay_type:'Credit card')PaymentType.create(pay_type:'Purchase order')
运行rake db:seed,检查test数据库还是没有记录.思考发现以上代码貌似是在development上下文中执行的,也就是说它把记录添加到development.sqlite3数据库中去了啊!我们可以让其在test上下文中执行:
RAILS_ENV=test rake db:seed
再次检查test数据库,终于有内容了!但是别急着高兴哦!再次rake test还是出错,错误相同!再次查看test数据库中的内容:又被清空了.遂猜测到test的运行机制:首先清空test数据库,然后再做测试!那么解决起来就简单鸟:
首先在test/test_helper.rb中添加一个新的方法init_payment_types:
class ActiveSupport::TestCase # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. fixtures :all def init_payment_types PaymentType.delete_all PaymentType.create(pay_type:'Check') PaymentType.create(pay_type:'Credit card') PaymentType.create(pay_type:'Purchase order') end # Add more helper methods to be used by all tests here...end
然后修改test出错的控制器test类OrderControllerTest中的setup方法的block:
class OrdersControllerTest < ActionController::TestCase setup do #Order::PAYMENT_TYPES = PaymentType.all.map {|type|type.pay_type} init_payment_types @order = orders(:one) endend
再测试一下,咦怎么还是不行啊,错误依旧!?进一步检查发现:虽然setup中手动预先插入了支付方式记录,但是貌似model Order工作方式如下:在test中Order Class会首先初始化,注意这早于setup的执行;意味着这时test数据库中还是没有内容;执行到validates :pay_type,inclusion:PaymentType.types一句时会生成类似代码:
validates :pay_type,inclusion:[#空的数组]
等到以后在Order控制器测试时虽然执行了setup,但是以后的create和update测试方法的model检查用的还是一开始生成的[#空的数组],所以还是执行不通过!一种办法是在rake test之前调用RAILS_ENV=test rake db:seed;或者只有早于第一次Order Class初始化在test数据库中插入payment_types,在一番搜索后,发现可以在config/initizlizers下加入初始化ruby脚本来实现该功能:
首先在上述目录下建立新文件:make_payment_types.rb,加入以下代码:
if Rails.env == "test" PaymentType.delete_all PaymentType.create(pay_type:'Check') PaymentType.create(pay_type:'Credit card') PaymentType.create(pay_type:'Purchase order')end
我们只需要在测试试才用执行该脚本哦;或者为了不违背DRY原则,我们可以在make_payment_types.rb中这样写:
if Rails.env == "test" load 'db/seeds.rb'end
经过一番折腾,终于全部测试通过啦!但是还别急啊,这样重构总觉得哪里有问题,感觉很别扭,本猫觉(Jiao三声)着还是要重构哦!要知最后大结局请看博文之三吧! :)
- rails将类常量重构到数据库对应的表中之二
- rails将类常量重构到数据库对应的表中之三
- rails将类常量重构到数据库对应的表之后记
- rails将类常量重构到数据库对应的表中之一
- Java EE 查询 将数据库中对应的表逐行转换成DAO实体类。
- Java 将数据库对应的表生成对应的实体类,包含注释信息
- 将excel表的数据导入oracle数据库对应的表中
- 将B数据库客户基本信息表中的字段插入到A数据库表中对应的字段中
- rails 迁移migrate model对应的数据库字段类型
- rails小重构:将图片加入产品Model之二
- 将mysql数据库中对应的表里面的数据导入到excel中
- ruby rails 中对数据库的操作
- ruby rails 中对数据库的操作
- ImmGetProperty 对应的常量含义
- Rails 将 mysql 数据库和表转换成 utf-8
- 将上传文件以二进制形式存入数据库中,并下载数据库中的二进制数据生成对应的文件
- Android中声音文件与数据库表的对应关系
- sqlplus 中导入Excel到数据库的对应表
- 解决Cannot change version of project facet Dynamic web module to 2.5
- 安装sublime样式插件:Color Schemes
- uva 11995 ADT
- Windows核心编程读书笔记3——线程(3) 正确编写C/C++运行库下的线程
- Oracle中会话的状态
- rails将类常量重构到数据库对应的表中之二
- Eclispe java 调试技巧
- 创建操作/删除多行数据的UITableView的细节
- android图片压缩总结
- shell--传入参数的处理
- 如何在网页中实现右上角“平方”、右下角那种数字的写法?
- c语言跨平台
- 手把手陪你搭建Windows Server 2012 + SQL SERVER 2014群集(之域控服务器环境准备)
- Python进阶04 函数的参数对应