我为Rails应用程序提供了一组Test :: Unit测试。它是在OS X下在Ruby 1.8.6,Rails 2.3.4下开发的。
我也在使用thinkbot-shoulda 2.10.2。
我正在使用标准的Rails灯具,而不是工厂。
我已将该项目检出到CentOS Linux 5工作站,以供其他开发人员使用。他正在运行Ruby 1.8.7。
(该应用程序正在生产的CentOS Linux 5上运行,并且在那里工作正常。)
在我的同事的CentOS开发机器上,所有单元测试都在通过。
但是,大多数(但不是全部)功能性测试都是错误的。我已经隔离了一个测试(从项目中移除所有其他测试)以缩小故障排除范围。
context 'on DELETE to :destroy' do
setup {
delete(:destroy, { :id => addresses(:mary_publics_address).id }, stans_id)
}
should 'delete the address' do
assert Address.find(:all, :conditions => {
:id => addresses(:mary_publics_address).id
} ).blank?
end
should 'delete the addresses phone numbers' do
assert PhoneNumber.find(:all, :conditions => {
:id => phone_numbers(:mary_publics_phone_number).id
} ).blank?
end
end
我们得到的错误是......
[abc@abc contactdb]$ rake test:functionals --trace
(in /home/abc/projects/contactdb)
[ ... ]
/usr/local/ruby_187/bin/ruby -I"lib:test" "/home/abc/.gem/ruby/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader.rb" "test/functional/addresses_controller_test.rb"
Loaded suite /home/abc/.gem/ruby/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader
Started
.E
Finished in 0.426749 seconds.
1) Error:
test: on DELETE to :destroy should delete the addresses phone numbers. (AddressesControllerTest):
ActiveRecord::RecordNotFound: Couldn't find Address with ID=1254595889
/test/functional/addresses_controller_test.rb:107:in `__bind_1255114457_160068'
/usr/local/ruby_187/lib/ruby/gems/1.8/gems/thoughtbot-shoulda-2.10.2/lib/shoulda/context.rb:369:in `call'
/usr/local/ruby_187/lib/ruby/gems/1.8/gems/thoughtbot-shoulda-2.10.2/lib/shoulda/context.rb:369:in `run_current_setup_blocks'
/usr/local/ruby_187/lib/ruby/gems/1.8/gems/thoughtbot-shoulda-2.10.2/lib/shoulda/context.rb:368:in `each'
/usr/local/ruby_187/lib/ruby/gems/1.8/gems/thoughtbot-shoulda-2.10.2/lib/shoulda/context.rb:368:in `run_current_setup_blocks'
/usr/local/ruby_187/lib/ruby/gems/1.8/gems/thoughtbot-shoulda-2.10.2/lib/shoulda/context.rb:350:in `test: on DELETE to :destroy should delete the addresses phone numbers. '
2 tests, 1 assertions, 0 failures, 1 errors
rake aborted!
Command failed with status (1): [/usr/local/ruby_187/bin/ruby -I"lib:test" ...]
我认为关键的谜团是它无法找到具有该ID的Address
。
另一个因素是当我注释掉这个区块时,剩下的测试通过了。
should 'delete the addresses phone numbers' do
assert PhoneNumber.find(:all, :conditions => {
:id => phone_numbers(:mary_publics_phone_number).id
} ).blank?
end
之前有人见过这个吗?
故障排除建议?
答案 0 :(得分:2)
在Ruby中实现Hash
es的一件事是它们不保留排序。我在更改哈希顺序之前遇到了问题,具体取决于内存中加载了什么代码 - 即使在某处添加puts "foo"
也会导致错误消失,因为我没有意识到{{1}的排序在代码深处某处发挥了作用。 (注意:Hash
确实保留了1.9.1中的排序,特别是因为这样的问题,如果我猜的话。)这与你所说的如何评论代码使其他代码通过的内容一致。由于使用Hash
作为YAML
来读入大多数灯具,因此认为这可能是一个原因是合理的。找到Hash
排序(即像Hash
之类的东西)有所不同的某个地方可能会或可能没有意义。如果不出意外,请记住这一点。
您是否尝试过使用each
代替Fixtures.identify(:mary_publics_phone_number)
? (另请参阅:Fixtures documentation。)要记住的另一件事是:您可能没有唯一的夹具名称。为了以防万一,我会检查重复项。我知道很多人只是复制和粘贴灯具,因为他们不知道phone_numbers(:mary_publics_phone_number).id
能否提供默认值。在此过程中,他们可能会忘记更改灯具的名称。例如:
YAML
从OS X迁移到Linux时我遇到的另一个问题是Ruby版本的细微差别。 (即使两者都报告1.8.6,请记住补丁级别很重要。)过去,Red Hat版本的Ruby在垃圾收集器中有内存泄漏,需要我们有时重启长时间运行的进程。 (在我们意识到发生了什么之前,它创建了一些难以发现的错误,因为它们不会发生长时间。)因为CentOS与Red Hat有关(基本上与RHEL相同),我可以想象其他版本差异会导致问题。我知道OS X从来没有遇到我描述的内存泄漏问题,这使得更难以缩小bug。就差异介于1.8.6和1.8.7之间,您必须参考更改日志。请注意,从源代码构建的Ruby版本和打包版本的行为可能会有所不同 - 我认为内存泄漏问题是由打包Ruby的人员引入的。
这些只是一些可能的原因。请用您所发现的内容报告!