Sto costruendo un'applicazione web ASP.NET MVC 3 (.NET 4) e sto provando a testare l'unità il più possibile.
Ho un'azione del controller Details(int customerId)
che dovrebbe mostrare una vista il cui modello è un Customer
public class Customer
{
public int? Id { get; set; }
[Required]
[Display(Name = "Customer Name")]
public string Name { get; set; }
...
public IList<CustomerComment> Comments { get; set; }
}
L'azione del controller è la seguente:
public ActionResult Details(int customerId)
{
var model = service.Get(customerId);
if (model != null)
return View(model);
return RedirectToAction("Index");
}
Come puoi vedere, questo chiama direttamente service.Get
public Customer Get(int id)
{
return repository.Get(id);
}
Il servizio ha una ICustomerRepository
iniettata e chiama direttamente il metodo Get
di quel repository.
La mia domanda riguarda il popolamento della raccolta Comments
.
Come / dove dovrebbe essere popolato Comments
e come posso testarlo?
La visualizzazione Details
è l'unica posizione che visualizza l'elenco di commenti, quindi ha bisogno di questi dati. Posso vedere due modi per popolare questo.
-
Fai tutto nell'implementazione
ICustomerRepository.Get
.
Ciò potrebbe portare a una situazione in linea in cui sto utilizzando Get ma non a visualizzare i commenti. Ciò significherebbe che sto facendo un costoso (forse)JOIN
ma non utilizzando i risultati. -
Avere un
ICustomerCommentsRepository/Service
iniettato nel mio servizio o controller che viene utilizzato per popolareComments
quando richiesto.
C'è una preferenza?
In secondo luogo, come metteresti alla prova questo?
Nella seconda istanza, potrei affermare che ICustomerCommentsRepository.Populate(Customer customer)
è chiamato sul mio mock dal Controller / Servizio.
Nella prima situazione tutta la responsabilità risiede nel mio repository quindi in senso unitario, non è testabile in quanto l'implementazione concreta utilizzata nell'app effettiva deve parlare al DB e quindi è un test di integrazione.
Mi manca qualcosa? La ICustomerCommentsRepository
sarebbe una cattiva idea?