测试 Rspec 不清空数据库问题

grant · 2013年02月21日 · 最后由 Grant 回复于 2013年02月22日 · 3802 次阅读

我用的是 rails2 + rspec 1.3。

我想 spec 测试的时候,不要清空数据库。默认他会清空数据库所有数据。 google 了下,说设置 config.use_transactional_fixtures = false 会有用。 但我试了下,不起效果?有大神知道什么原因吗?

Rails2 已经是很久远的事情了。会不会跟你执行测试的命令有关,如果记得没错的话,rake test 会自动用 schema.rb 去完整的初始化 test 数据库,然后在跑测试,所以每次都重置一遍。

#1 楼 @lgn21st 这个和 rails2、3 应该关系不大吧,use_transactional_fixtures 这个设定是用于基于事务进行数据库回滚的,如果设为 false,那要明确你的 cleanup 方式(可能是某个第三方库完成的,检查一下你的 spec_helper.rb 的内容)

@lgn21st 是的。老项目是 rails2,想加测试代码的。 我使用 rake spec 命令跑的。就会每次清空数据库。 如果我改用 spec spec/xxx.rb 命令 直接跑就不会清空数据库。

#3 楼 @Grant 大概两年前,身边所有的项目就陆续迁移到 3 了。不过我觉得跑测试应该确保每次测试完成后清空数据库,并尽量保证测试环境隔离,且可重复执行,所以我觉得你不希望清空数据库这个需求挺特殊的。

@lgn21st 系统以前有个插件动态读取数据里面的值,生成常量。如果数据库没有值的话,这些常量将不会生成,rake 加载 rails 代码的时候,就会出编译的错误。

#5 楼 @Grant 我觉得是一定可以通过 mock 或者 stub 等方式很好的处理的。如果无法很好处理,那么我会怀疑设计或者实现层面上是不是有问题。

@lgn21st 你说的很对,是的老系统设计不是很好。mock 或者 stub 搞不定,因为他是在 load spec_helper.rb 文件的时候,就报错了。

在 test 的 before 里面手动往数据库中添加需要的内容呢?

@ywjno 错误的原因是这样的 load spec_helper.rb 头部有如下代码 ·require File.expand_path(File.join(File.dirname(FILE),'..','config','environment'))·

然后就会加载项目里面所有的 model, 这时候有个 model 里面会说有个常量没有定义的错误出现, 而这个常量的初始化也是 model 加载的时候动态读数据库生成的。 因为这时候数据库被清空了,所以常量也没生成出来。

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