Rspec: EmeraldComponent:Module 的未定义方法“StandardError”

Rspec: undefined method `StandardError' for EmeraldComponent:Module

在我的 gem 中,我有以下模块:

module EmeraldComponent

  def self.create(full_name)
    raise StandardError('Base directory for components is missing.') if base_directory_missing?
    raise StandardError('An Emerald Component must have a name.') if full_name.empty?
    raise StandardError('An Emerald Component must have a namespace.') if simple_name?(full_name)
    write_component(full_name)
    true
  end

  def self.write_component(full_name)
    ## To be implemented
  end

  def self.simple_name?(full_name)
    vet = full_name.split('.')
    vet.length == 1
  end

  def self.base_directory_missing?
    not (File.exist?(EmeraldComponent::BASE_DIRECTORY) && File.directory?(EmeraldComponent::BASE_DIRECTORY))
  end

end

在我对该模块的 Rspec 测试中,我有这些:

context 'create' do

  it 'raises an error if the base directory for components is missing' do
    expect {
      EmeraldComponent.create('test.component.Name')
    }.to raise_error(StandardError)
  end

  it 'raises an error if it receives an empty string as component name' do
    expect {
      EmeraldComponent.create('')
    }.to raise_error(StandardError)
  end

  it 'raises an error if it receives a non-namespaced component name' do
    expect {
      EmeraldComponent.create('test')
    }.to raise_error(StandardError)
  end

  it 'returns true if it receives a non-empty and namespaced component name' do
    expect(EmeraldComponent.create('test.component.Name')).to be true
  end

碰巧当我运行测试时,除了第一个,所有的测试都通过了。这给了我以下错误。

1) EmeraldComponent Methods create returns true if it receives a non-empty and namespaced component name
Failure/Error: raise StandardError('Base directory for components is missing.') if base_directory_missing?

 NoMethodError:
   undefined method `StandardError' for EmeraldComponent:Module
 # ./lib/EmeraldComponent.rb:10:in `create'
 # ./spec/EmeraldComponent_spec.rb:48:in `block (4 levels) in <top (required)>'

如您所见,它表示 StandardError 未定义 EmeraldComponent:Module。

但是StandardError不属于EmeraldComponent:Module!

此外,同样的 StandardError 在其他测试中运行良好!

我已经和这个错误斗争了一段时间,然后决定在这里post。有什么建议吗?

你应该在原地StandardError.newStandardError你的create方法

 def self.create(full_name)
    raise StandardError.new('Base directory for components is missing.') if base_directory_missing?
    raise StandardError.new('An Emerald Component must have a name.') if full_name.empty?
    raise StandardError.new('An Emerald Component must have a namespace.') if simple_name?(full_name)
    write_component(full_name)
    true
  end

@victorCui 是正确的。

而不是提高 StandardError.new(),推荐的方法是写:

raise StandardError, "message"

https://github.com/rubocop-hq/ruby-style-guide#exception-class-messages