DomandaIn TDD e DDD, come gestite le proprietà di sola lettura nei falsi?
Come gestisci i campi di sola lettura durante la creazione di falsi?
Sfondo
Sono nelle fasi principianti di usare ASP.Net MVC e sto usando negozio di articoli sportivi di Steven Sanderson e Nerd Cena di Scott Gu come esempi. Un piccolo problema che ho appena colpito è come lavorare con proprietà di sola lettura quando si fanno falsi. Sto usando LINQToSQL.
mia interfaccia è:
public interface IPersonRespository
{
Person GetPerson(int id);
}
e il mio falso diventa
public class FakePersonRepository
{
public Person GetPerson(int id)
{
return new Person {id="EMP12345", name="John Doe", age=47, ssn=123-45-6789, totalDrWhoEpisodesWatched=42};
}
}
Ecco il mio problema. I campi id, ssn e totalDrWhoEpisodesWatched sono di sola lettura, quindi il codice sopra non funzionerà. Tuttavia, non riconosco come creare una persona nuova falsa e impostare una proprietà di sola lettura. Sono sicuro che ci sia una soluzione, ma non l'ho ancora trovata nelle mie ricerche.
Aggiornamento: ereditarietà + proprietà che si nasconde come soluzione potenziale?
Non ho ancora deciso una soluzione risoluta al problema. Non mi piace la nozione di modificare le mie classi Dominio allo scopo di creare falsi. Per me, l'aggiunta di markup alle classi di dominio per fare test è una forma di accoppiamento aggiunto - l'accoppiamento con l'implementazione del test. Ora sto studiando un'altra possibilità, ovvero creare una classe FakePerson, che eredita da Person, ma nasconde le proprietà con nuove proprietà di lettura-scrittura.
public class FakePerson: Person
{
public new int age { get; set; }
public new string ssn { get; set; }
public new int totalDrWhoEpisodesWatched { get; set; }
}
Finora, questa soluzione è come mi sto appoggiando. Rompe il principio di sostituzione di Liskov, tuttavia questo non mi infastidisce più di tanto in un progetto di test. Sarei lieto di ascoltare qualsiasi critica e/o feedback su questo come soluzione.
Vincitore: Mock Frameworks
Moq sembra fare il lavoro. La mia ultima soluzione di nascondere la proprietà attraverso l'ereditarietà, in effetti, funziona, tuttavia utilizzando Moq, ottengo un insieme standardizzato di funzionalità che è più gestibile. Presumo che altri framework mock abbiano questa funzionalità, ma non ho controllato. Si dice che Moq sia più semplice per l'inizio della finta scrittura, cosa che sicuramente sono in questo momento.
Perché è impostato per essere in sola lettura? –
È impostato su sola lettura, poiché nessun utente del dominio ha i diritti per modificare le proprietà. Potrebbe essere per una serie di motivi, ma spesso, poiché l'applicazione non ha i diritti per modificare il campo perché è un campo di calcolo/generato automaticamente o a causa delle politiche di sicurezza del database. – John
Su un argomento leggermente non correlato, consigliamo di modificare i nomi delle proprietà in PascalCase per rispettare le convenzioni di denominazione .NET. http://msdn.microsoft.com/en-us/library/ms229043(loband).aspx –