Test del codice procedurale

6

TL; DR. Scrittura di codice procedurale all'interno di una transazione DB. Come posso migliorare la progettazione del codice, quindi è meglio testabile?

Nella mia applicazione ho un oggetto di servizio che esegue più cose all'interno della stessa transazione. Vedi il codice in Ruby di seguito:

class CreateRefundService
  def create(customer_id)
    ActiveRecord::Base.transaction do
      refund = create_refund(customer_id)
      credit = add_credits_to_customer(customer_id)

      send_email(refund)
      add_note(refund, credit)
    end
  end

  private

  # ... implementation of all 4 methods above
end

Sto provando a scrivere 4 test per verificare che tutte e quattro le cose accadano durante la transazione, ma inizia a sentirsi a disagio, dal momento che per ogni metodo sotto test ho bisogno di bloccare altri 3 metodi. Questo mi dà la garanzia che probabilmente c'è un problema su questo design.

Sono sotto vincoli che più cose devono accadere durante la stessa transazione.

    
posta gmile 27.11.2015 - 19:31
fonte

1 risposta

5

I quattro metodi sembrano fare cose che hanno senso da soli. Quindi non li vedrei come "dettagli di implementazione che devono essere mantenuti privati", li vedrei come unità individuali, riutilizzabili, ciascuna unità che merita di essere testata da sola. Quindi puoi renderli pubblici e scrivere un test unitario direttamente per ciascuno.

Ciò che rimane è decidere se hai bisogno di qualche tipo di test di integrazione automatizzato per il metodo create , o se fai affidamento su altri test su un livello o livello diverso per questo metodo.

    
risposta data 27.11.2015 - 20:18
fonte

Leggi altre domande sui tag