2012-10-17 2 views
3

레거시 테스트/유닛 (최소) 테스트와 RSpec을 모두 갖춘 Rails 3.2.8 프로젝트가 있습니다. Jenkins는 지속적인 통합을 진행하고 있지만 잠시 동안은 실패를 눈치 채지 못했습니다. 그 이유는 테스트 실패시 종료 코드를 무시하고 실패한 테스트 또는 사양이 있는지 여부에 관계없이 종료 코드 0을 반환하는 것으로 보입니다.Ruby에서 at_exit 메소드로 어떤 콜백이 등록되어 있는지 어떻게 알 수 있습니까?

나는 파고를했으나 커널/at_exit 스택을 조사하여 proc를 등록하는 보석/플러그인을 확인하려고합니다.

  • 은 왜 실패 테스트는 0의 종료 코드를 반환 할 : 나는 그래서, 도움 면도이 야크를 찾고 있어요

    C.

    에서 구현있어 언어의 기능을 알고?
  • at_exit에 proc/콜백을 추가한다고 가정하면 콜백이 무엇인지 알 수 있습니까?
    • 나는 C로 쓰여졌 고 소스를 보았다. 나는 그것에 루비 갈고리가 보이지 않는다. 추가 할 수있는 타사 확장이 있습니까? 아니면 거기에 가시성을 허용하는 루비에 대한 패치를 알고있는 사람이 있습니까?
    • dtrace가 들어가서 살펴볼 수 있습니까?

내가했던 어떤 것들은 : 나는 at_exit의 보석과 설치된 라이브러리를 grepped했지만 너무 의심스러운 아무것도 찾지 못했습니다

  • .
  • 내 Rails 앱에서 동일한 gemset을 사용하면 단일 사양으로 새 앱을 만들어서 실행하면 예상대로 작동합니다 (테스트 통과시 종료 코드 0을 반환하고 실패하면 1을 반환합니다)
  • 패치/확장 프로그램을 찾았습니다. at_exit

어떤 일에 그 도움을 제공하는 가시성을 루비 아직 완료하지 않은 :

  • 의 DTrace (내가 맥에있어) 배우 려다 - 내가 본 프리젠 테이션 방법을 보여주는 그것을 사용하지만 아직 시도하지 않았습니다.
  • 내 프로젝트에서 모든 보석을 제거하여 그 원인을 파악하십시오. 프로젝트마다 다를 수 있습니다.

미리 도움을 주셔서 감사합니다.

PS : 나는 Gemfile에 이진 트리 검색 (반을 끄고 테스트를 실행, 오프 나머지 절반을 설정했다, 갱신으로

gem 'rails', '~> 3.2.8' 
gem 'acts-as-taggable-on', '~> 2.3.1' 
gem "akamai_api", :path => "vendor/git/akamai_api" 
gem 'dalli' 
gem "gabba" 
gem "googlecharts", :require => "gchart" 
gem "hpricot" 
gem 'jquery-rails' 
gem 'linkscape' 
gem "logging", "1.4.3" 
gem 'machinist', '>= 2.0.0.beta2' 
gem "mysql2" 
gem 'newrelic_rpm' 
gem "premailer-rails3" 
gem 'rack-cache' 
gem "rack-ssl-enforcer" 
gem 'sendgrid' 
gem "tokyocabinet", "1.29" 
gem 'twitter-bootstrap-rails', :git => 'git://github.com/seyhunak/twitter-bootstrap-rails.git' 
gem "useragent" 
gem "yajl-ruby", :require => "yajl" 

group :assets do 
    gem 'coffee-rails' 
    gem 'sass-rails' 
    gem 'uglifier' 
end 

group :no_rake do 
    gem "vanity" 
end 

group :development, :test do 
    gem 'debugger' 
    gem 'thin' 
    gem 'rspec-rails' 
end 

group :test do 
    gem 'vanity' 
    gem 'minitest-rails' 
    gem 'mocha' 
end 

: 다음은이 프로젝트의 Gemfile에있는 보석이다. . repeat) 테스트가 제대로 실패 할 때까지. 로깅 보석으로 인해 rspec이 0이 아닌 값을 반환하고 googlecharts gem이 테스트/유닛을 엉망으로 만들었습니다. 이 시점에서 나는 왜 그런지 모릅니다.

라이브러리의 어떤 동작 (또는 앱의 종속 코드)이 테스트에 영향을 미치는지 더 자세히 살펴보기는 어렵습니다. 빠른 grep은 Kernel # at_exit을 사용하여 아무 것도 반환하지 않았고 각각의 소스에 대한 간단한 정보는 아무것도 표시하지 않았습니다. 나는 계속 파고 갈거야,하지만 그건 내가 지금까지 발견 한거야.

아직 문제가 무엇인지 알지 못해서 버그 보고서를 제출하지 않았습니다.

+0

나는이 같은 문제에 봉착했습니다. 나도 응용 프로그램과 동일한 Gemfile과 하나의 실패한 스펙을 가진 베어 레일 프로젝트를 시도했다. 그리고 그것은 1을 반환했다. 그래서 프로젝트 자체에 뭔가 있어야한다. –

+0

이것에 대한 후속 조치 ... 나는 그것을 로깅 보석과 분리 할 수있었습니다. 나는 그것을 최신 버전으로 업데이트했고 문제는 사라졌다. 로깅 젬 내부의 코드를 보았는데 (너무 많은 시간을 소비하지는 않았지만) 왜 고쳐 졌는지 분명하지 않았습니다. –

답변

2

당신 꼭 사랑 루비 :

alias original_at_exit at_exit 
def at_exit(*args, &block) 
    puts "registered at exit: #{caller * "\n"}" 
    original_at_exit *args, &block 
end 
+0

나는 실제로 이것을 시도하지는 않았지만 그것이 효과가있는 것처럼 보였다. 위에서 말했듯이, 저는 제 문제의 뿌리를 다른 방법으로 찾아 냈습니다. 내가 at_exit으로 다시 futz해야한다면, 나는 이것을 명심 할 것이다. –