今天在做单元测试时发现一个小问题,就是如果运行多个测试类,会因为外键问题无法删除测试数据导致测试失败.如下:
测试类一
测试类二
表间关系:
user 与 blog 是一对一,blog与 blog_members是一对多, share_catagories与shares也是一对多,user与shares也是一对多
问题症状:
如果先运行ShareTest,测试通过.再运行BlogTest时夹具在测试方法运行前初始化数据,实际上是删除表再建表的一个过程,但因为前面运行过ShareTest了,此时在对user表初始时就会发生有外键引用(shares),无法初始化(fixtures),导致测试失败.
解决方法:
将表间的外键关系删除.
这个问题到也不是什么大问题,后来看了一下typo的建表脚本,确实是没有外键,但有点想不明白,难道在设计数据库时不需要用到外键?还是说在测试时将外键删除掉,正式发布时还在用带有外键的脚本建表.typo已经是一个可以放在生产环境下使用的系统了,它就不需要外键,全部通过程序控制?或者说在Model里定义表关联时用dependent参数来保证外键?
我个人也不喜欢使用各种数据库自有的特性,但外键却是大多数数据库支持的东西,如果仅是因为测试而去除这个强大的功能,好像有点........
测试类一
ruby 代码
- require File.dirname(__FILE__) + '/../test_helper'
- class ShareTest < Test::Unit::TestCase
- self.use_transactional_fixtures = true
- fixtures :users,:share_catagories,:shares
- # Replace this with your real tests.
- def test_last_shares
- assert_not_nil Share.last_shares(5)
- end
- end
测试类二
ruby 代码
- require File.dirname(__FILE__) + '/../test_helper'
- class BlogTest < Test::Unit::TestCase
- self.use_transactional_fixtures = true
- fixtures :users,:blogs,:blog_members
- def test_hearty_seniority
- assert_not_nil Blog.hearty_seniority(2)
- end
- end
表间关系:
user 与 blog 是一对一,blog与 blog_members是一对多, share_catagories与shares也是一对多,user与shares也是一对多
问题症状:
如果先运行ShareTest,测试通过.再运行BlogTest时夹具在测试方法运行前初始化数据,实际上是删除表再建表的一个过程,但因为前面运行过ShareTest了,此时在对user表初始时就会发生有外键引用(shares),无法初始化(fixtures),导致测试失败.
解决方法:
将表间的外键关系删除.
这个问题到也不是什么大问题,后来看了一下typo的建表脚本,确实是没有外键,但有点想不明白,难道在设计数据库时不需要用到外键?还是说在测试时将外键删除掉,正式发布时还在用带有外键的脚本建表.typo已经是一个可以放在生产环境下使用的系统了,它就不需要外键,全部通过程序控制?或者说在Model里定义表关联时用dependent参数来保证外键?
我个人也不喜欢使用各种数据库自有的特性,但外键却是大多数数据库支持的东西,如果仅是因为测试而去除这个强大的功能,好像有点........