Rspec 在 lib + 初始值设定项上

Rspec on lib + initializer

我正在尝试测试我创建的库。它使用初始化程序自动加载。

这是我的

# config/initializer/my_lib.rb
MyLib.configure do |config|
  config.salt   = Rails.application.secrets.encrypted_salt
  config.secret = Rails.application.secrets.encrypted_secret
end

# lib/my_lib.rb
class MyLib

  class << self
    attr_accessor :configuration

    def config
      @configuration ||= Configuration.new
    end

    def configure
      yield(config)
      raise 'Salt not specified' unless config.salt
      raise 'Secret not specified' unless config.secret
    end
  end

  class Configuration
    attr_accessor :salt, :secret
  end
end

我想要测试的是没有 saltsecretMyLib.configure 会引发 RuntimeError.

我已经尝试了以下测试,但我认为我卡住了

allow(described_class).to receive(:configure) do |&config|
  config.salt = nil
  config.secret = nil
end

在前面的示例中,|config||&config| 都为 config 提供了 nil 值。

使用expect error:

expect do
  MyLib.configure do |config|
    config.salt   = nil
    config.secret = nil
  end
end.to raise_error RuntimeError 

但我建议您创建自己的异常 class,例如 MyLib::ConfigurationError,因为 RuntimeError 可能有其他原因,如果代码中存在错误,测试实际上可能会通过。