2007-02-03
Rails单元测试的一点点疑惑
关键字: Unit Test
今天在做单元测试时发现一个小问题,就是如果运行多个测试类,会因为外键问题无法删除测试数据导致测试失败.如下:
测试类一
测试类二
表间关系:
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参数来保证外键?
我个人也不喜欢使用各种数据库自有的特性,但外键却是大多数数据库支持的东西,如果仅是因为测试而去除这个强大的功能,好像有点........
- 00:10
- 浏览 (1804)
- 评论 (4)
- 分类: Ruby On Rails
- 进入论坛
- 相关推荐
评论
thundercao
2007-09-07
试试看
Readonly
2007-09-07
check out
http://dev.rubyonrails.org/ticket/2404
一个已经存在了2年的争论,rails team的人一直以为了保障unit test速度为理由,不肯打这个patch,简直是OOXX...
这个问题还不单单是外键问题,在一些牵涉到统计的测试用例里面,也会有前一个unit test fixuture没有清理干净,导致断言出错的情况。
偶建议用讨论里面有个rick发的patch,很简洁地解决了这个问题。
http://dev.rubyonrails.org/ticket/2404
一个已经存在了2年的争论,rails team的人一直以为了保障unit test速度为理由,不肯打这个patch,简直是OOXX...
这个问题还不单单是外键问题,在一些牵涉到统计的测试用例里面,也会有前一个unit test fixuture没有清理干净,导致断言出错的情况。
偶建议用讨论里面有个rick发的patch,很简洁地解决了这个问题。
dogstar
2007-09-07
外键的作用无外乎是保证数据完备,这些可以用程序做到。而且,使用数据库这些特性的话也有很大的开销,不完备检查呀之类的。就我目前的经验来看,没有必要使用外键。至少我到现在从来没有用过。
pig345
2007-09-07
似乎Rails有意在回避这个问题。
他都没有内置对外键的自动支持。
他都没有内置对外键的自动支持。
- 浏览: 8184 次

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
Rails单元测试的一点点疑 ...
试试看
-- by thundercao -
Rails单元测试的一点点疑 ...
check out http://dev.rubyonrails.org/tic ...
-- by Readonly -
Rails单元测试的一点点疑 ...
外键的作用无外乎是保证数据完备,这些可以用程序做到。而且,使用数据库这些特性的话 ...
-- by dogstar -
Rails单元测试的一点点疑 ...
似乎Rails有意在回避这个问题。他都没有内置对外键的自动支持。
-- by pig345 -
acts_as_ferret 在使用中 ...
刚好遇上类似问题,现在解决了,感谢lz。
-- by myxex






评论排行榜