RSpec: Cómo escribir un caso de prueba de unidad para recibir una excepción que se genera en un método privado

He implementado el bloqueo optimista para la condición de carrera. Para eso, agregué una columna adicionallock_version en el Producto. Método:recalculate llama a @ privamethod_1 luego guarda save!) el producto. No puedo usarsave! en privadomethod_1, porque fallará las otras cosas. No quiero reestructurar la lógica empresarial.

#Product: Model's new field:
    #  lock_version                       :integer(4)      default(0), not null

def recalculate
  method_1
  self.save!
end

private
def method_1
    begin
      ####
      ####
      if self.lock_version == Product.find(self.id).lock_version
         Product.where(:id => self.id).update_all(attributes)
      else
         raise ActiveRecord::StaleObjectError.new(self, "test")
      end
    rescue ActiveRecord::StaleObjectError => e
        if tries < 3
           tries += 1
           sleep(1 + tries)
           self.reload
           retry
        else
           raise Exception.new(timeout.inspect)
        end
    end
end

Rspec Caso de prueba:

  it 'if car is updated then ActiveRecord::StaleObjectError should be raised' do
    prod_v1 =Product.find(@prod.id)
    prod_v2 = Car.find(@prod.id)
    prod_v1.recalculate
    prod_v1.reload  # will make lock_version of prod_v1 to 1

    prod_v2.recalculate # howvever lock_version of prod_v2 is still 0.

    expect(car_v2).to receive(:method1).and_raise(ActiveRecord::StaleObjectError)
  end

Cuando intento escribir sobre el caso de prueba, entonces debería aparecer una ExcepciónActiveRecord::StaleObjectError. Sin embargo, recibo un error como

 Failure/Error: expect(car_v2).to receive(:set_total_and_buckets_used).and_raise(ActiveRecord::StaleObjectError)
 ArgumentError:
   wrong number of arguments (0 for 2)

Respuestas a la pregunta(1)

Su respuesta a la pregunta