Sto cercando di scrivere test unitari per convalidare il mio controller assicurandomi che le proprietà di binding siano impostate correttamente. Con la seguente struttura del metodo, come posso garantire che solo i campi validi siano passati da un test unitario?Unit Test the BindAttribute per i parametri del metodo
public ActionResult AddItem([Bind(Include = "ID, Name, Foo, Bar")] ItemViewModel itemData)
{
if (ModelState.IsValid)
{
// Save and redirect
}
// Set Error Messages
// Rebuild object drop downs, etc.
itemData.AllowedFooValues = new List<Foo>();
return View(itemData);
}
più ampia Spiegazione: Molti dei nostri modelli sono elenchi di valori consentiti che non vogliamo inviare avanti e indietro, così noi li ricostruire quando il (ModelState.IsValid == false). Al fine di garantire che tutto funzioni, vogliamo mettere in atto dei test unitari per affermare che l'elenco è stato ricostruito, ma senza cancellare l'elenco prima di chiamare il metodo, il test non è valido.
Stiamo utilizzando il metodo di supporto da questo SO answer per garantire che il modello sia convalidato, e quindi il nostro test dell'unità è simile a questo.
public void MyTest()
{
MyController controller = new MyController();
ActionResult result = controller.AddItem();
Assert.IsNotNull(result);
ViewResult viewResult = result as ViewResult;
Assert.IsNotNull(viewResult);
ItemViewModel itemData = viewResult.Model as ItemViewModel;
Assert.IsNotNull(recipe);
// Validate model, will fail due to null name
controller.ValidateViewModel<ItemViewModel, MyController>(itemData);
// Call controller action
result = controller.AddItem(itemData);
Assert.IsNotNull(result);
viewResult = result as ViewResult;
Assert.IsNotNull(viewResult);
itemData = viewResult.Model as ItemViewModel;
// Ensure list was rebuilt
Assert.IsNotNull(itemData.AllowedFooValues);
}
Qualsiasi assistenza o puntatori nella giusta direzione è molto apprezzata.
E 'un po' non chiaro cosa stai cercando. Stai cercando un modo per rilevare che l'attributo Bind è stato utilizzato e impostato con i valori corretti sul tuo controller (ID, Foo ...)? O stai cercando un modo per verificare che il runtime MVC utilizzi correttamente l'attributo? Oppure un modo per applicare manualmente l'attributo al modello di test per ricreare il comportamento del runtime MVC, in modo da poter testare i metodi? O qualcos'altro interamente? – forsvarir
Sto cercando un modo per verificare che l'attributo bind sia applicato, in modo che se un modello ha campi che non sono dichiarati per l'associazione, i valori non vengono passati dal test al controller nello stesso modo in cui non sarebbero passati dalla vista al controller su un post. L'obiettivo finale è garantire che tutti i campi siano collegati correttamente con i soli valori associati aggiornati su un post al controller, oltre a poter pubblicare un modello "cattivo" (accade per alcuni casi di convalida del server) e avere la logica per se (ModelState.IsValid) esercitata da un test. –
È fantastico che tu abbia funzionato. Generalmente non è una buona idea modificare la tua soluzione nella tua domanda, dal momento che è effettivamente una risposta, piuttosto che una domanda. Posso suggerire che potresti voler modificare la tua domanda e postarla invece come auto-risposta alla domanda. Aiuta a partizionare il Q & A e come bonus si potrebbe finire con l'upvote dispari per questo. Se vuoi mantenere la tua soluzione accanto alla domanda quando le persone guardano il post, puoi anche cambiare la risposta accettata al tuo post (che non ho problemi anche se le opinioni di altre persone differiscono) – forsvarir