2012-11-13 2 views
3

보석은 기능의 대안으로 보석 a 또는 b을 지원하려고합니다.루비에서 보석의 선택적 종속성을 지정하는 올바른 방법 Gemfile

b으로 돌아 가면 defined?(A)으로 확인합니다. 괜찮습니다.

하지만 보석 개발자는 이러한 종속성을 어떻게 지정합니까?

1) Gemfile에 무엇을 넣어야합니까?

group :development, :test do 
    gem 'a', :require => false 
    gem 'b', :require => false 
end 

이 A, B를 자동으로 필요하지 Bundle.require(:test) 수 있습니다? 우리가 내 시험에서 b로 다시 떨어질 때

2) 어떻게 명시 적으로 ab 별도) 시나리오를 모방 (또는 모의하도록 요청할 수 있습니다?

3) 또한 a 또는 b 중 하나를 보석에 대한 전제 조건으로 지정하려면 어떻게해야합니까?

감사합니다.

답변

0

오래 전이 같은 질문이있었습니다. 내 솔루션 개발자가이 동작을 지정해야한다고 생각했다. 나는 그것을 보석에 쓰지 않고 위키에 명시 할 것이다. 개발자가 의존성 중 하나를 정의해야한다는 점을 명확히 문서화하는 것이 좋습니다.

더 나은 결과를 얻으려면 보석 초기화를 확인하고, 종속성을 찾지 못하면 아무 것도없고, 단지 런타임 예외를 발생 시키거나 원하는 경우 사용자 자신의 예외를 검사 할 수 있습니다. =)

+0

thx, 3), 아마도 1)에 대한 의견이 있습니다. 이러한 보석에 대해 언급하지 않았습니까? 2)에 대한 어떤 생각? –

+0

나는 당신의 의견을 이해하지 못했습니다. =/ –

2

는 의존성에 a 보석을 포함하지만 어쨌든 require을하지 마십시오. 실패하면 LoadError가 발생합니다.이 곳에서 구출 할 수 있습니다.

begin 
    require 'a' 
rescue LoadError 
    # The 'a' gem is not installed 
    require 'b' 
end 

나는이 사용하고이 설정을 테스트하는 가장 좋은 방법입니다 믿습니다.

  1. 는 백엔드에 대한 인터페이스를 정의하고 사용자 정의 구현 쉽게 연결 할 수 있도록

    module YourGem 
        class << self 
        attr_accessor :backend 
    
        def do_something_awesome 
         backend.do_something_awesome 
        end 
        end 
    end 
    
  2. ab 백엔드를 구현하십시오.

    # your_gem/backends/a.rb 
    require 'a' 
    
    module YourGem::Backends::A 
        def self.do_something_awesome 
        # Do it 
        end 
    end 
    
    # your_gem/backends/b.rb 
    require 'b' 
    
    module YourGem::Backends::B 
        def self.do_something_awesome 
        # Do it 
        end 
    end 
    
  3. 사용하려는 것으로 설정하십시오.

    begin 
        require 'your_gem/backends/a' 
        Gem.backend = YourGem::Backends::A 
    rescue LoadError 
        require 'your_gem/backends/b' 
        Gem.backend = YourGem::Backends::B 
    end 
    

    b가 설치되어있는 경우에도 YourGem::Backend::A를 사용합니다.

  4. 테스트하기 전에, 모두 ab 보석이 설치되어있는 테스트 코드에 require 모두 백엔드를 확인 한 백엔드와 테스트를 실행 한 후 다른 백엔드와 테스트를 다시 실행합니다.

+0

구현 코드는 괜찮지 만 테스트에서 모의 ​​연습을 통해이 LoadError를 발생시키는 데 필요한 모범 사례가 무엇입니까? –

+0

@viktortron, 내 대답을 업데이트했습니다. 이것은 다소 특이한 설정이지만, 그것이 내가 테스트하는 방법입니다. –

관련 문제