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

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

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

    我也在使用thoughtbot shoulda 2.10.2。

    我使用的是标准的Rails夹具,而不是工厂。

    在我同事的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" ...]
    

    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 回复  |  直到 16 年前
        1
  •  2
  •   Benjamin Oakes    16 年前

    有一件事需要了解 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 YAML 提供默认值的能力。在此过程中,他们可能会忘记更改夹具的名称。例子:

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

    从OS X迁移到Linux时,我遇到的另一个问题是Ruby版本的细微差异。(即使两者都报告1.8.6,也要记住补丁级别很重要。)过去,Red Hat版本的Ruby在垃圾收集器中存在内存泄漏,有时需要我们重新启动长时间运行的进程。(在我们意识到发生了什么之前,它产生了一些很难找到的bug,因为它们不会在一个 长的 时间。)由于CentOS与Red Hat有关(与RHEL基本相同),我可以想象其他版本差异会导致问题。我知道OS X从未出现过我描述的内存泄漏问题,这使得缩小漏洞变得更加困难。至于1.8.6和1.8.7之间的差异,您必须参考更改日志。请注意,从源代码构建的Ruby版本和打包版本的行为可能不同——我认为内存泄漏问题是由打包Ruby的人引入的。

    这些只是几个可能的原因。请汇报您的发现!