Non sono mai stato un “test addicted” nel senso che non scrivo i test per tutto, scrivo i test per molte cose (ed in alcuni casi tendo maniacalmente ad un 100% di Code Coverage), alcune le faccio in TDD, e per altre ritengo semplicemente inutile scrivere test, se non a fronte di un bug dove allora prima scrivo il test, e se assenti, un set di test che mi parino da eventuali regressioni, che lo riproduce poi procedo con la fix.

Credo di avere una minima esperienza da garantirmi un buon deisgn anche se non è emergente, ne è riprova il fatto che tutte le volte che ho dovuto scrivere test su qualcosa di già disegnato non mi sono mai pentito del design; in questo senso c’è anche da dire che l’uso spinto di un tool per Inversion of Control obbliga ad un design di un certo tipo.

Resta il fatto che ci sono momenti, per tutto c’è sempre mastercard sia chiaro, in cui la scrittura di un paio di test toglie dalle grane mostruosamente più rapidamente dell’F5. Sto lavorando ad una cosa in cui la base dati sta in parte dietro un set di servizi quindi per poter “mixare” questi dati con quelli provenienti dal db “locale” mi sono dovuto parzialemnte reinventare la ruota (non ho trovato di meglio e sono aperto a suggerimenti) e mascherare completamente l’ORM dietro una mia “Unit of Work” che sia in grado di fare il dispatch delle chiamate “a destra e a manca” in base al tipo di entità che state chiedendo, simulando ove possibile anche le “join” e altri giochetti. Detto fatto.

Oggi pomeriggio mi sono dedicato alla gestione della IdentityMap e in questo caso gli Unit Test sono una vera manna dal cielo perchè vi permettono di simulare quello che volete senza fare il benchè minimo sforzo:

[TestMethod]
public void dataContext_getByKey_using_identityMap_should_return_the_same_instance()
{
    var paf = MockRepository.GenerateStub<IPersistanceActionFactory>();

    var rp = MockRepository.GenerateMock<IRepositoryProvider>();
    rp.Expect( obj => obj.Resolve<IRepository<StubEntity>>() )
        .Return( new StubEntityRepository() )
        .Repeat.Once();

    var dc = new DataContext( new IdentityMap(), rp, paf );

    var a = dc.GetByKey<StubEntity>( new Key<Int32>() );
    var b = dc.GetByKey<StubEntity>( new Key<Int32>() );

    a.ShouldBeEqualTo( b );

    rp.VerifyAllExpectations();
}

[TestMethod]
public void dataContext_getByKey_then_getAll_using_identityMap_should_return_the_same_instance()
{
    var paf = MockRepository.GenerateStub<IPersistanceActionFactory>();

    var rp = MockRepository.GenerateMock<IRepositoryProvider>();
    rp.Expect( obj => obj.Resolve<IRepository<StubEntity>>() )
        .Return( new StubEntityRepository() )
        .Repeat.Once();

    var dc = new DataContext( new IdentityMap(), rp, paf );

    var a = dc.GetByKey<StubEntity>( new Key<Int32>() );
    var list = dc.GetAll<StubEntity>();

    a.ShouldBeEqualTo( list.ElementAt( 0 ) );

    rp.VerifyAllExpectations();
}

[TestMethod]
public void dataContext_getAll_then_getByKey_using_identityMap_should_return_the_same_instance()
{
    var paf = MockRepository.GenerateStub<IPersistanceActionFactory>();

    var rp = MockRepository.GenerateMock<IRepositoryProvider>();
    rp.Expect( obj => obj.Resolve<IRepository<StubEntity>>() )
        .Return( new StubEntityRepository() )
        .Repeat.Once();

    var dc = new DataContext( new IdentityMap(), rp, paf );

    var list = dc.GetAll<StubEntity>();
    var a = dc.GetByKey<StubEntity>( new Key<Int32>() );

    list.ElementAt( 0 ).ShouldBeEqualTo( a );

    rp.VerifyAllExpectations();
}

Altrimenti l’unica soluzione plausibile è una tonnellata di F5 (che fatti su una solution con 68 progetti non è certo una passeggiata ;-)) uniti a tanta fantasia per capire se nel complesso di quello che l’applicazione sta facendo il vostro componente si sta comportando nella maniera attesa… che equivale ad una soluzione non plausibile ;-)

.m