代码之家  ›  专栏  ›  技术社区  ›  Ethan

测试:通过OS X的单元测试,在CentOS上出错

  •  0
  • Ethan  · 技术社区  · 15 年前

    我有一组针对Rails应用程序的测试::单元测试。它是在OSX上Ruby1.8.6、Rails2.3.4下开发的。

    我也在使用thoughtbot shoulda 2.10.2。

    我用的是标准的铁轨固定装置,不是工厂。

    我已经在CentosLinux5工作站上签出了这个项目,以供其他开发人员使用。他在运行Ruby 1.8.7。

    (该应用程序在CentOS Linux 5生产环境下运行,在那里运行良好。)

    在我同事的Centos Dev机器上, 单元 测试通过了。

    然而,大多数,但不是全部 功能性 测试出错了。我隔离了一个测试(从项目中删除所有其他测试),以缩小故障排除范围。

      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" ...]
    

    我认为关键的谜团是为什么它找不到 Address 和那个ID.

    另一个因素是,当我注释掉这个块时,剩下的测试就通过了。

        should 'delete the addresses phone numbers' do
          assert PhoneNumber.find(:all, :conditions => {
            :id => phone_numbers(:mary_publics_phone_number).id
          } ).blank?
        end
    

    以前有人见过这个吗?

    故障排除建议?

    1 回复  |  直到 15 年前
        1
  •  2
  •   Benjamin Oakes    15 年前

    有一件事要认识到 Hash Ruby中的es是它们不保留顺序。在此之前,我遇到过一些问题,根据内存中加载的代码更改散列顺序——甚至添加 puts "foo" 因为我没有意识到 搞砸 在代码的某个深处产生了不同。(注: 搞砸 是否保留了1.9.1中的顺序,具体是因为这样的问题,如果我猜的话。)这与您所说的注释代码如何使其他代码通过是一致的。因为大多数装置都是用 YAML 作为 搞砸 嗯,有理由认为这可能是一个原因。找到一个地方 搞砸 订购(例如 each )在你的情况下,有什么不同可能或没有意义。如果没有别的事情,那就是要记住的事情。

    你试过用吗 Fixtures.identify(:mary_publics_phone_number) 而不是 phone_numbers(:mary_publics_phone_number).id ?(也见: Fixtures documentation 还要记住的一点是:您可能没有唯一的设备名称。为了以防万一,我会查一下副本。我认识很多人只是复制和粘贴装置,因为他们不知道 山药 提供默认值的能力。在这个过程中,他们可能会忘记更改夹具的名称。例子:

    DEFAULTS: &DEFAULTS
      created_on: <%= 3.weeks.ago.to_s(:db) %>
    
    first:
      name: Smurf
      <<: *DEFAULTS
    

    从OSX到Linux的另一个问题是Ruby版本的细微差别。(即使这两个报告都是1.8.6,请记住补丁级别很重要。)以前红帽版本的Ruby在垃圾回收器中有内存泄漏,这要求我们偶尔重新启动长时间运行的进程。(在我们意识到发生了什么之前,它造成了一些很难发现的错误,因为它们不会发生在 长的 时间。)因为CentOS与RedHat相关(基本上与Rhel相同),我可以想象其他版本的差异会导致问题。我知道OSX从未遇到过我描述的内存泄漏问题,这使得缩小缺陷变得更加困难。至于1.8.6和1.8.7之间的差异,您必须参考变更日志。请注意,从源代码构建的Ruby版本和打包版本的行为可能不同——我认为内存泄漏问题是由打包Ruby的人引入的。

    这只是几个可能的原因。请把你的发现报告回来!