2009-02-09 35 views
5

我正在为RC1中的控制器编写一些单元测试。这里是 控制器公共签名我测试:ASP.Net中TryUpdateModel的模拟要求RC1

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

的AcceptColleague内实现使用从表单字段填充同事对象的TryUpdateModel(同事)方法。但是,尝试单元测试方法时,我遇到TryUpdateModel行上的“对象引用未设置为对象的实例”错误。

这里是我的单元测试代码:

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

我缺少的东西在嘲讽或者我应该使用像AcceptColleague(同事的同事)不同的公众签名,然后测试ModelState.IsValid财产?

如果是这样,怎么看不到一种方式我可以嘲笑控制器的只读ModelState属性?

回答

13

TryUpdateModel和ModelState都需要在RC 1中嘲笑。唯一需要提供的是ValueProvider。为此,您可以使用FormCollection.ToValueProvider()。

您仍然需要模拟您的存储库,但是没有什么需要在此功能框架中进行模拟。试试这个:

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

    // action 

注意:没有模拟的HttpContext需要,除非你的代码需要它。

+1

克雷格,非常感谢。我想我错过了那里的浮动文档。我现在像一种魅力。再次 感谢, 科尔 – 2009-02-09 22:04:02