Рубин: Как проверить приватный метод? - PullRequest
0 голосов
/ 05 октября 2018

Я реализовал Оптимистическую блокировку для состояния гонки.Если lock_version не совпадает с обновленной lock_version в базе данных, то триггер будет инициирован трижды.Можете ли вы предложить, как проверить это событие повтора.

Примечание: я не могу изменить частный метод2

Публичный

def method1
  begin
     method2
  rescue Exception => e

  end
end

Личный

  def method2
    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

Контрольный пример:

  it 'method1 should call three times if there is stale_object' do
    prod_v1 = Car.find(@car.id)
    prod_v1.stub(:stale_object?).and_return true
    prod_v1.method1
    expect{prod_v1}.to receive(:method2).exactly(3).times
  end

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

 Failure/Error: expect{car_v1}.to receive(:method2).exactly(3).times
   (#<Proc:).method2(any args)
       expected: 2 times with any arguments
       received: 0 times with any arguments

1 Ответ

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

Вы устанавливаете ожидание после того, как метод уже был вызван, поэтому вы получаете 0 раз, он вызывался 0 раз после этой строки.

Измените порядок, переместите ожидание ВЫШЕ строку prod_v1.method1и это будет работать.Использование expect работает для частных и публичных методов.

...