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)