2009-02-09 13 views
5

Estoy en el proceso de escribir algunas pruebas de unidad para mis controladores en RC1. Aquí está la firma pública del controlador estoy probando:Requisitos de burla para TryUpdateModel en ASP.Net RC1

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

La implementación dentro de la AcceptColleague utiliza el método TryUpdateModel (colega) de poblar el objeto colega de los campos del formulario. Sin embargo, me estoy encontrando con un error de "Referencia de objeto no configurado a una instancia de un objeto" en la línea TryUpdateModel al intentar probar el método por unidades.

Aquí es mi unidad de código de prueba:

  // 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"); 

Me estoy perdiendo algo en la burla o debo utilizar una firma pública diferente como AcceptColleague (colega Colega) y luego probar la propiedad ModelState.IsValid?

Si es así, ¿cómo no veo una forma en que puedo simular que la propiedad ModelState de solo lectura está fuera del controlador?

Respuesta

13

TryUpdateModel y ModelState requieren cero se burla en RC 1. Lo único que debe proporcionar es un ValueProvider. Para eso, puede usar FormCollection.ToValueProvider().

Aún necesitará burlarse de su repositorio, pero no hay nada de lo que necesite burlarse en el marco para esta funcionalidad. Prueba esto:

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

    // action 

Nota: No se burlado HttpContext es necesario, a menos que su código así lo requiere.

+1

Craig, muchas gracias. Supongo que me perdí eso en la documentación flotante que hay. Ahora trabajo como un encanto. Gracias de nuevo, Cole –

+3

realmente necesita proporcionar un contexto, si no se obtiene ArgumentNullException, valor no puede ser null.Parameter nombre: ControllerContext –

+0

MVC 5.2.3 dio la excepción nulo Omar describió anteriormente. controller.ControllerContext = new ControllerContext(); Permite que la prueba de la unidad progrese para mí. – Anthony

Cuestiones relacionadas