Durante l'installazione di test, è meglio utilizzare API di basso livello per ottenere il mio sistema nello stato giusto o utilizzare le stesse astrazioni che la mia applicazione userebbe? Sono specificamente interessato a ciò che promuove la manutenzione a lungo termine in grandi basi di codici.
Esempio (in Ruby, ma la mia domanda è indipendente dalla lingua):
Un utente può acquistare un oggetto utilizzando la classe Sale:
class User
attr_accessor :join_source, :status
def web_join!
@join_source = 'web'
@status = 'rookie'
end
def promote!
@status = 'veteran'
end
def web_rookie?
join_source == 'web' && status == 'rookie'
end
end
class Sale
attr_reader :item, :user
def initialize(item, user)
@item = item
@user = user
end
def finalize
item.owner == user
if user.web_rookie?
Email.send_web_rookie_receipt(user)
end
end
end
Nel test di vendita, dovrò creare un utente in vari stati. Posso utilizzare le API a basso livello:
user = User.new
user.join_source = 'web'
user.status = 'rookie'
# test that the send_web_rookie_receipt goes out
user.status = 'veteran'
# test that the send_web_rookie_receipt does not goes out
O l'API che l'utente espone:
user = User.new
user.web_join!
# test that the send_web_rookie_receipt goes out
user.promote!
# test that the send_web_rookie_receipt does not goes out
Per chiarire, non sto chiedendo di testare User
in questo scenario. Ti sto chiedendo dei miei test per Sale
, e se l'impostazione per testare Sale
dovrebbe utilizzare più metodi astratti su User
(come 'promote!) O più concreti, metodi di basso livello (attributo attributo).