L'unità che verifica il codice basato sul tuo DAL dovrebbe essere semplice: usa il repository schema per disaccoppiare il livello aziendale dal tuo ORM. Fornisci i tuoi POCO da un repository astratto, quindi puoi fornire un repository "reale" in produzione (che utilizza il tuo ORM), o un repository finto a scopo di test che fornisce solo POCO di test-data senza alcun accesso a DB. L'utilizzo di un ORM che funziona con POCO qui ha il vantaggio di poter facilmente creare quegli oggetti in memoria, senza la necessità di fare affidamento sull'ORM.
Una domanda diversa è come testare automaticamente metodi come "AddCustomer", supponendo che questo metodo contenga solo il codice relativo al database o all'ORM. Avendo un breve sguardo nella documentazione e nel codice sorgente di PetaPoco, sembra supportare solo un database con capacità in memoria: SqlLite. Quindi immagino che potresti configurare un'istanza SqlLite leggera per i tuoi dati di test e scrivere i tuoi test in questo modo.
In teoria, è possibile farlo anche con un sistema di DB relazionali in piena regola come Oracle o MS SQL Server, ma questa opzione è spesso troppo lenta e necessita di un sovraccarico amministrativo per essere pratica. Se vuoi comunque provare questa rotta, ti suggerisco di dare un'occhiata a DBUnit.NET , che supporta questo approccio.
Qualunque cosa tu faccia, potrebbe essere una buona idea separare questi due casi nel tuo codice: scrivi (1) codice estraendo gli oggetti necessari dal tuo DB in memoria, e (2) separati codice per fare la logica di business, senza alcun accesso a DB. Sicuramente avrete bisogno del (3) codice che gestisce (1) e (2) per farli funzionare insieme, ma (1) e (2) potrebbero essere testati quindi più facilmente in isolamento.