Rails 测试无效的问题

fsword · 2012年03月17日 · 最后由 fsword 回复于 2012年03月17日 · 2151 次阅读

今天发现一个严重的 bug

背景是这样的,我之前在系统中提供的数据复制功能,是让模型调用对象自身的 clone 方法,然后赋给另外一个用户来实现,但是刚刚使用时才发现,这么做会直接把模型的所有数据迁移过去,id 还是原来那个——这样用户看到的就不是复制,而是移动

于是动手改了代码 clone -> dup,手工验证是通过的 但是编写测试的时候我发现,无论我是否修改这个 bug,测试都会通过

很奇怪,难道 rspec 修改了 object?

后记,根据进一步试验,发现和rspec、AR等等无关,应该是spork驱动的环境没有重新装载导致的问题  

我理解也是这样,clone 就是同一份。复制数据的话得 new 一个对象。

貌似是对的呢?

new_post = post.clone
new_post == post # true

new_post = post.dup
new_post.new_record? # true
new_post.id # nil
new_post.save! #true
new_post == post # false

看来是我没说清楚,应该用 dup 而不是 clone,这个我们都知道,我的问题是,rake spec 在代码为 clone 的情况下依然会通过测试,这个就很郁闷了,那我还怎么相信我的测试集呢

续:今天重新试验了一下,发现可能是 spork 没有重新装载的问题,修改代码以后如果完整的跑一下 rspec 是没有问题的,但是如果用--drb 单独跑指定的那个测试用例的话,就会出现前面的问题,关掉--drb 单独跑那个 spec(这时环境重新装载)也没有问题

BTW:我改一下帖子标题

--drb 的是做什么的?我有点怀疑是这个东西的 bug:-)

#6 楼 @hooopo 应该与此无关,drb 就是 distributed ruby - ruby 的远程调用框架,我这个例子里面,如果 rspec 通过 drb 框架驱动的用例,其运行环境是在 spork fork 出来的进程里面,关掉 drb 以后则是独立启动的进程,这两者的差异应该就是 rails 环境是否重新装载了

需要 登录 后方可回复, 如果你还没有账号请 注册新账号