Usare un framework di mock nei test – Behavior stub

Nel post precedente avevamo visto come creare Stub con RhinoMock, ora vedremo invece come simulare il valore di ritorno di un metodo.

Esempio 2 – Valori di ritorno di un metodo

Mock2

Il nostro obiettivo è testare il metodo ApproveOrder, che imposta la proprietà ApprovedBy recuperando l'utente a partire dal id.

public class OrderManager
{
    IDataContext context;

    public OrderManager(IDataContext context)
    {
        this.context = context;
    }

    public void ApproveOrder(Order order, Int32 idUser)
    {
        User user = context.GetByKey<User>(idUser);

        order.ApprovedBy = user;

        context.Save<Order>(order);
    }
}

Dobbiamo fare in modo di farci restituire dal context.GetByKey un istanza di User per verificare che ApprovedBy sia stata valorizzata.

[TestMethod()]
public void ApproveOrderTest1()
{
    var context = MockRepository.GenerateStub<IDataContext>();

    context.Stub(x => x.GetByKey<User>(1)).Return(new User() { Id = 1, Name = "Rossi" });

    OrderManager target = new OrderManager(context);
    Order order = new Order();
    Int32 idUser = 1;
    
    target.ApproveOrder(order, idUser);

    Assert.AreEqual(order.ApprovedBy.Id, idUser);
}

RhinoMock ci permette di creare una classe di mock che implementa l’interfaccia IDataContext che si aspetta una chiamata del metodo GetByKey<User> con il parametro idUser impostato a 1 e ritorna una istanza di User.
Se avessimo voluto ignorare i parametri in ingresso ci bastava aggiungere in modo fluent IgnoreArguments().

Tag di Technorati: ,,

Tecniche di storicizzazione – Dettaglio

Scenario

Un ordine è associato ad un cliente.
Vogliamo memorizzare tutte le modifiche che vengono effettuate su un cliente.
Vogliamo avere le informazioni del cliente al momento della creazione dell’ordine (es Ragione sociale) ma anche avere le informazioni aggiornate ad oggi (es Area).

Possibile soluzione

Storicizazzione4

Dividiamo il cliente in due tabelle una clienti_tb che conserva i dati immutabili, l’altra clienti_rev_tb che mantiene lo storico di tutte le modifiche apportate sui clienti e tramite il campo isActve indica la revisione attivà.
Quando vogliamo creare un legame con un specifica versione del cliente useremo la chiave idCliente_rev invece quando vogliamo avere il cliente in generale useremo idCliente.

Considerazioni

Abbastanza complessa da gestire soprattutto quando ci sono più relazioni, pensiamo ad esempio se volessimo storicizzare anche i contatti dei clienti.
Può essere usata anche in contesti dove la revisione necessaria di una approvazione. Ad esempio potremmo avere un medicinale attivo e uno in revisione e solo al momento della approvazione le caratteristiche del nuovo medicinale diventeranno attive.

Tag di Technorati: ,

Tecniche di storicizzazione - Data

Scenario

In un progetto possono lavorare più dipendenti.
Ogni dipendente ha una retribuzione, questa può variare nel tempo.
Un progetto per essere realizzato ha un budget di ore preventivate per ogni dipendente.
Vogliamo poter calcolare il budget in una data specifica anche nel passato per capirne le variazioni.

Possibile soluzione

Storicizazzione3

Aggiungiamo alle retribuzioni il concetto di validità che viene espresso tramite un range di date.
Quando dobbiamo calcolare il budget andiamo a prendere il salario attivo per la data richiesta.

Considerazioni

Complessa da gestire e nella mia esperienza anche abusato a discapito di soluzioni più semplici.
Necessario quando non si hanno eventi specifici da sfruttare, in questo caso il budget dobbiamo essere in grado di calcolarlo per qualsiasi data.

Tag di Technorati: ,

Tecniche di storicizzazione – Copia

Scenario

Una fattura ha un indirizzo di spedizione.
La fattura compresa di indirizzo avendo valore legale non deve variare nel tempo.
L’indirizzo del cliente può variare nel tempo.

Possibile soluzione

Storicizazzione2

Copiamo i dati di spedizione nella fattura.
Gli indirizzi sono liberi di essere modificati senza influire sulle fatture già emesse.

Considerazioni

Sicuramente è una delle tecniche più grezze ma forse anche la più semplice.
Più il numero dei campi da storicizzare è alto più la nostra entità diventerà pesante da gestire e da elaborare.
Perdiamo l’integrità referenziale.
Andremo ad appiattire eventuali relazioni. 

Tag di Technorati: ,

Tecniche di storicizzazione - Attivo

Scenario

Un ordine viene elaborato dal un dipendente.
Quando un dipendente esce dall’organico dell’azienda vogliamo che gli ordini precedentemente elaborati mantengano il riferimento al dipendente.
Quando un dipendente esce dall’organico dell’azienda non deve essere più possibile associarlo all’ordine.

Possibile soluzione

Storicizazzione1

Aggiungiamo al soggetto dipendente una informazione che ci dica se è attivo o meno.
Se il dipendente esce dall’organico verrà disabilitato ma continuerà ad esistere e l’associazione con nuovi ordini sarà fatta solo selezionando i dipendenti attivi.

Considerazioni

Tecnica abbastanza semplice che può essere usata in tanti contesti soprattutto con le entità accessorie.
Per evitare che ad esempio l’utente Mario Rossi venga modificato in Luigi Bianchi, le entità vengono rese non modificabili con lo contro che per un errore di imputazione è necessario disabilitare e creare un nuovo dipendente.
Una possibile alternativa potrebbe essere dare la possibilità di modificare l’entità se non è mai stata utilizzata, questo però porta ad un aumento della complessità e anche della manutenibilità nel caso vengano aggiunte nuove relazioni.

Tag di Technorati: ,

Tecniche di storicizzazione

In tutte le applicazioni soprattutto in quelle enterprise capita di dover storicizzare delle informazioni, esempi classici sono: l’indirizzo di spedizione del cliente in fattura, il salario del dipendente durante gli avanzamenti di carriera, i codici materiale per un ordine.

Per risolvere queste problematiche esistono più tecniche che ovviamente portano con loro vantaggi e svantaggi, proviamo a vedere alcune di queste tecniche partendo da dei possibili scenari.

- Tecniche di storicizzazione – Attivo
- Tecniche di storicizzazione – Copia
- Tecniche di storicizzazione – Data
- Tecniche di storicizzazione – Dettaglio

«giugno»
domlunmarmergiovensab
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910