ruby-on-rails 如何减少RSpec错误测试的重复?

44u64gxh  于 2023-04-22  发布在  Ruby
关注(0)|答案(2)|浏览(121)

欢迎并感谢所有收听的人。
我有一个可能产生错误的方法,我有一些特殊的逻辑,当错误发生时,在另一个异常被重新引发之前运行。
例如:

def some_cool_method
 error_prone_logic

 rescue StandardError => e
   logging_methods
   
   error_handling

   raise SpecificException.new
end

等级库设置:
我正在为error_prone_logic中使用的一个实体创建一个存根,并使其抛出如下异常:

before do
      allow(some_entity_double).to receive(:work).and_raise(StandardError, 'RIP')
    end

我的问题是,当我想测试在错误发生后运行的逻辑时,我想分离规范,我生成的代码必须总是测试异常:

it 'raises explicit error' do
      expect { subject }.to raise_error(SpecificException)
    end

    it 'logs the error' do
      expect(logger).to receive(:error)

      expect { subject }.to raise_error(SpecificException)
    end

    it 'does error handling' do
      expect(ErrorHandler).to receive(:handle)

      expect { subject }.to raise_error(SpecificException)
    end

如果每个用例末尾的expect { subject }.to raise_error(SpecificException)缺失,则测试套件将无法运行。
所以我的问题是
有没有一种方法可以设置它,使我只有一个expect { subject }.to raise_error(SpecificException)规范,其余的只Assert他们需要Assert的东西?

hujrc8aj

hujrc8aj1#

怎么样错误提高失能到方法?

def some_cool_method
 error_prone_logic

rescue StandardError
  logging_methods
   
  error_handling

  raise_error
end

在这种情况下,您可以在 debugging 误引发测试之外的任何地方模拟它

before
  allow(some_cool_entity).to receive(:raise_error)
end

it 'raises explicit error' do
  allow(some_cool_entity).to receive(:raise_error).and_call_original

  expect { subject }.to raise_error(SpecificException)
end

it 'logs the error' do
  expect(logger).to receive(:error)
end

it 'does error handling' do
  expect(ErrorHandler).to receive(:handle)
end
lyr7nygr

lyr7nygr2#

如果应该允许该方法引发SpecificException,则只需在错误冒泡到测试时捕获该错误。

before 
  some_cool_method
  rescue SpecificException
end 

it 'logs the error' do
  expect(logger).to receive(:error)
end

it 'does error handling' do
  expect(ErrorHandler).to receive(:handle)
end

这与expect { subject }.to raise_error(SpecificException)发生的情况完全相同,但没有创建预期。
注意the explicit use of subject in RSpec is considered a code smell

相关问题