5

gem 旨在支持 gemsab作为功能的替代品。

在代码中,我检查defined?(A)是否可以恢复b

但是作为 gem 开发者如何指定这些依赖呢?

1)我在 Gemfile 中放了什么。

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

这允许Bundle.require(:test)不自动要求 a,b?

2)当我们在我的测试中回退时,如何明确要求a并单独模拟(或模拟)场景?bb

3)另外我如何指定a或者b是gem的先决条件。

谢谢

4

2 回答 2

4

不要a在依赖项中包含 gem,但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
    

    YourGem::Backend::A即使b安装了它也会使用。

  4. 在测试之前,确保在测试代码中安装了两个abgems,require两个后端,用一个后端运行测试,然后用另一个后端再次运行测试。

于 2012-11-13T15:29:18.937 回答
0

不久前我也收到了同样的问题。我的解决方案是认为开发人员应该指定这种行为。我不会在 gem 上指定它,而是在 wiki 上指定它。我建议您清楚地记录开发人员需要定义其中一个依赖项。

为了使它更好,您可以检查 gem 的初始化,寻找依赖关系,如果找不到,只需引发运行时异常,或者如果您愿意,您可以自己的异常。=)

于 2012-11-13T13:50:40.873 回答