Ruby on rails 测试:单元测试在OSX上通过,在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开发机器上,所有的单元测试都通过了 然而,大多数但不是所有的功能测试都

我有一组针对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上有过很好的体验。