Rspec: Как протестировать исключение в частном методе? - PullRequest
0 голосов
/ 07 октября 2018

Получение ошибки при тестировании исключения в приватном методе.Как проверить, что исключение возникает в приватном методе, который вызывается из публичного метода?

Public

def public_method
    private_method
end

Private

  def private_method
    tries = 0
    begin
      raise Product::StaleObjectError.new("Product is changed while you were editing") if stale_object?
      // Do some work
      raise Exception.new("Total amount used is greater than approved") if total_approved < 0

      // Save Product
    rescue Product::StaleObjectError => e
      if tries < MAX_RETRIES
        tries += 1
        sleep(1 + tries)
        reload
        retry
      else
        raise Product::StaleObjectError("Product is changed while you were editing")
      end
    end
    attributes
  end

Test Case:

  before(:each) do
    @prod_v1 = Product.new
  end
  it 'if product stale, then an exception should raise' do
    Product.any_instance.stub(:stale_object?).and_return(true)
    expect_any_instance_of(Product).to receive(:private_method).and_raise(Product::StaleObjectError.new("Product is changed while you were editing"), nil)
    @prod_v1.public_method
  end

Я получаю следующую ошибку для контрольного примера

 Failure/Error: @product_v1.private_method
 Product::StaleObjectError:
   Product is changed while you were editing
 # ./app/models/product.rb:10:in `private_method'
 # ./spec/models/product_spec.rb:67:in `block (4 levels) in <top (required)>'

Я попытался изменить структуру контрольного примера, но все еще получаю ошибки.

  it 'if product stale, then an exception should raise' do
   Product.any_instance.stub(:stale_object?).and_return(true)
    expect_any_instance_of(Product).to receive(:private_method).and_raise(Product::StaleObjectError.new(nil, nil))
    @prod_v1.public_method
  end

Ошибка

    Failure/Error: expect_any_instance_of(Product).to receive(:private_method).and_raise(Product::StaleObjectError.new(nil, nil))
 ArgumentError:
   wrong number of arguments (2 for 0..1)

1 Ответ

0 голосов
/ 07 октября 2018

try and_raise(Product::StaleObjectError.new(nil, nil))

см. Этот вопрос, который я задавал некоторое время об этой же проблеме:

Rspec - неверное количество аргументов при возникновении ошибки

...