2009-02-09 20 views
5

Sono in procinto di scrivere alcuni test di unità per i miei controller in RC1. Ecco firma pubblica del controllore sto testando:Requisiti di derisione per TryUpdateModel in ASP.Net RC1

 [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult AcceptColleague() 
    { 

L'implementazione all'interno del AcceptColleague utilizza il metodo TryUpdateModel (collega) di popolare l'oggetto collega i campi del modulo. Tuttavia, sto correndo in un errore "Riferimento oggetto non impostato su un'istanza di un oggetto" sulla linea TryUpdateModel mentre provavo a testare il metodo unitario.

Ecco la mia unità di codice di prova:

  // definition 
     HomeController controller = new HomeController(); 
     IColleagueRepository fakeColleagueRepo = MockRepository.GenerateMock<IColleagueRepository>(); 
     Colleague requestedColleauge = new Colleague(); 
     EmployeeInfo currentUser = new EmployeeInfo();    
     HttpContextBase fakeHttpContext = MockRepository.GenerateMock<HttpContextBase>(); 
     HttpRequestBase fakeHttpRequest = MockRepository.GenerateMock<HttpRequestBase>(); 
     ControllerContext fakeContext = MockRepository.GenerateMock<ControllerContext>(fakeHttpContext, new RouteData(), controller); 
     NameValueCollection fakeForm = new NameValueCollection(); 

     // expectations 
     fakeColleagueRepo.Expect(c => c.Read(1234)).Return(requestedColleauge); 
     fakeColleagueRepo.Expect(c => c.Update(requestedColleauge)); 
     fakeColleagueRepo.Expect(c => c.Add(new Colleague())).IgnoreArguments().Constraints(Is.NotNull()); 
     fakeContext.Expect(cx => cx.HttpContext).Return(fakeHttpContext); 
     fakeHttpContext.Expect(hcx => hcx.Request).Return(fakeHttpRequest); 
     fakeHttpRequest.Expect(hr => hr.Form).Return(fakeForm); 

     // setup 
     controller.ColleagueRepository = fakeColleagueRepo; 
     controller.ControllerContext = fakeContext; 
     requestedColleauge.TargetEmployeeInfoId = 123456; 
     requestedColleauge.GeneratedEmployeeInfoId = 654321; 
     currentUser.EmployeeInfoId = 123456; 
     fakeForm.Add("ColleagueId", "22222"); 

     // action 
     RedirectToRouteResult result = controller.AcceptColleague() as RedirectToRouteResult; 

     // validation 
     Assert.IsNotNull(result, "AcceptColleague() did not return RedirectToRouteResult"); 

mi sto perdendo qualcosa sul beffardo o dovrei usare una firma pubblico diverso, come AcceptColleague (Collega collega) e poi prova la proprietà ModelState.IsValid?

In tal caso, in che modo non vedo come posso deridere la proprietà di sola lettura di ModelState al di fuori del controller?

risposta

13

TryUpdateModel e ModelState richiedono entrambi zero mock in RC 1. L'unica cosa che devi fornire è un ValueProvider. Per questo, è possibile utilizzare FormCollection.ToValueProvider().

Avrete ancora bisogno di prendere in giro il vostro repository, ma non c'è nulla di cui si debba prendere in giro nel framework per questa funzionalità. Prova questo:

FormCollection fakeForm = new FormCollection(); 
    fakeForm.Add("ColleagueId", "22222"); 
    controller.ValueProvider = fakeForm.ToValueProvider(); 

    // action 

Nota: non è necessario HttpContext non supportato, a meno che il codice non lo richieda.

+1

Craig, grazie mille. Immagino di averlo perso nella documentazione fluttuante là fuori. Ora lavoro come un incantesimo. Grazie ancora, Cole –

+3

in realtà è necessario per fornire un contesto, se non si ottiene ArgumentNullException, valore non può essere il nome null.Parameter: controllerContext –

+0

MVC 5.2.3 ha dato l'eccezione Null Omar sopra descritto. controller.ControllerContext = new ControllerContext(); Permette al test dell'unità di progredire per me. – Anthony