2009-02-09 37 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