Ruby on rails 测试:单元测试在OSX上通过,在CentOS上出错
我有一组针对Rails应用程序的测试::单元测试。它是在OSX上Ruby 1.8.6和Rails 2.3.4下开发的 我还使用了thoughtbot shoulda 2.10.2 我用的是标准的轨道固定装置,不是工厂 我已经在CentOS Linux 5工作站上签出了该项目,供其他开发人员使用。他正在运行Ruby 1.8.7 (该应用程序在CentOS Linux 5上运行,并且在生产环境中运行良好。) 在我同事的CentOS开发机器上,所有的单元测试都通过了 然而,大多数但不是所有的功能测试都出错了。我已经隔离了一个测试(从项目中删除所有其他测试),以缩小故障排除范围Ruby on rails 测试:单元测试在OSX上通过,在CentOS上出错,ruby-on-rails,ruby,unit-testing,bdd,shoulda,Ruby On Rails,Ruby,Unit Testing,Bdd,Shoulda,我有一组针对Rails应用程序的测试::单元测试。它是在OSX上Ruby 1.8.6和Rails 2.3.4下开发的 我还使用了thoughtbot shoulda 2.10.2 我用的是标准的轨道固定装置,不是工厂 我已经在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的地址
另一个因素是,当我注释掉这个块时,剩下的测试通过了
should 'delete the addresses phone numbers' do
assert PhoneNumber.find(:all, :conditions => {
:id => phone_numbers(:mary_publics_phone_number).id
} ).blank?
end
有人见过这个吗
疑难解答建议?关于Ruby中的哈希
es,需要了解的一件事是它们不保留顺序。在此之前,我遇到过一些问题,根据内存中加载的代码更改哈希顺序——即使在某个地方添加puts“foo”
也会使bug消失,因为我没有意识到哈希的顺序在代码的某个深处产生了影响。(注意:Hash
确实保留了1.9.1中的顺序,特别是因为这样的问题,如果我猜的话。)这与您所说的注释代码如何使其他代码通过是一致的。由于大多数装置是使用YAML
作为Hash
es读入的,因此有理由认为这可能是一个原因。在您的情况下,找到一个散列
排序的地方(即在类似的每个
中)会产生不同的结果,可能有意义,也可能没有意义。如果没有别的,那就是要牢记在心
您是否尝试过使用装置。识别(:mary\u publics\u phone\u number)
而不是电话号码(:mary\u publics\u phone\u number)。id
?(另请参见:)另一件需要记住的事情:您可能没有唯一的设备名称。我会检查是否有重复的,以防万一。我认识很多人,他们只是复制和粘贴装置,因为他们不知道YAML
提供默认值的能力。在此过程中,他们可能会忘记更改夹具的名称。例如:
DEFAULTS: &DEFAULTS
created_on: <%= 3.weeks.ago.to_s(:db) %>
first:
name: Smurf
<<: *DEFAULTS
DEFAULTS:&DEFAULTS
创建于:
第一:
姓名:蓝精灵
非常感谢你的帮助。这似乎不是一个散列排序问题,但这是可能的。事实证明,确实存在一个非唯一夹具名称的案例,但不要认为这与此相关。我们将尝试在我同事的系统上安装1.8.6。没问题。我很高兴这至少缩小了可能的原因。虚拟机可能有助于对此进行调试。如果您尚未致力于VMware或Parallels之类的产品,我建议您使用VirtualBox()。它是免费的,开源的,并且有OSX和Linux两个版本。从未在CentOS上使用过,但我在OSX Leopard和Ubuntu上有过很好的体验。