3

我試圖單元測試ASP.NET MVC我控制器上的編輯動作3.Mvcontrib.MVC3.Testhelper的UpdateModel NullReferenceExceuption在單元測試

我已經通過的NuGet模擬出安裝Mvcontrib.MVC3.TestHelper我控制器上下文,但我仍然得到一個NullReferenceException

我的代碼看起來是這樣的:

[TestMethod] 
    public void it_should_redirect_to_index_after_editing_a_something_successfully() 
    { 
     var something= new SomeThing 
     { 
      ID = Guid.NewGuid(), 
      CreatedAt = DateTime.Now, 
      LastModified = DateTime.Now, 
      Owner = "Me", 
      Status = "new", 
      Title = "my Title", 
      Attachments = new List<Attachment>() 
     }; 

     var repo = new FakeRepository(); 
     var controller = new SomethingsController(repo); 
     new TestControllerBuilder().InitializeController(controller); 

     var result = controller.Edit(something) as RedirectToRouteResult; 
     result.AssertActionRedirect().ToAction<SomethingsController>(x => x.Index()); 
    } 

生產代碼看起來像這樣...

[HttpPost] 
    public ActionResult Edit(SomeThing something) 
    { 
     if (ModelState.IsValid) 
     { 
      var _something = _repository.GetDocumentByID(something.ID); 
      TryUpdateModel(_something); 
      _something.LastModified = DateTime.Now; 
      _repository.SaveChanges(); 
      return RedirectToAction("Index","Somethings"); 
     } 
     return View(something); 
    } 

即使我使用的UpdateModel或TryUpdateModel它alwas與一個NullReferenceException崩潰......

任何幫助,指針將是非常美妙......

回答

5

這裏是你如何才能夠着手:

public class Something 
{ 
    public Guid ID { get; set; } 
    public DateTime LastModified { get; set; } 
    public DateTime CreatedAt { get; set; } 
    public string Owner { get; set; } 
    public string Status { get; set; } 
    public string Title { get; set; } 
} 

public interface ISomeRepository 
{ 
    Something GetDocumentByID(Guid id); 
    void SaveChanges(); 
} 

public class HomeController : Controller 
{ 
    private readonly ISomeRepository _repository; 
    public HomeController(ISomeRepository repository) 
    { 
     _repository = repository; 
    } 

    public ActionResult Index() 
    { 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult Edit(Something something) 
    { 
     if (ModelState.IsValid) 
     { 
      var _something = _repository.GetDocumentByID(something.ID); 
      TryUpdateModel(_something); 
      _something.LastModified = DateTime.Now; 
      _repository.SaveChanges(); 
      return RedirectToAction("Index", "Home"); 
     } 
     return View(something); 
    } 
} 

和測試:

// arrange 
var something = new Something 
{ 
    ID = Guid.NewGuid(), 
    CreatedAt = DateTime.Now, 
    LastModified = DateTime.Now, 
    Owner = "Me", 
    Status = "new", 
    Title = "my Title", 
}; 
var somethingElse = new Something(); 
var repo = MockRepository.GenerateStub<ISomeRepository>(); 
var controller = new HomeController(repo); 
new TestControllerBuilder().InitializeController(controller); 
repo.Stub(x => x.GetDocumentByID(something.ID)).Return(somethingElse); 

var formValues = new FormCollection() 
{ 
    { "Owner", "some owner" }, 
}; 
controller.ValueProvider = formValues.ToValueProvider(); 

// act 
var actual = controller.Edit(something); 

// assert 
repo.AssertWasCalled(x => x.SaveChanges()); 
actual 
    .AssertActionRedirect() 
    .ToAction<HomeController>(x => x.Index()); 
+2

感謝您對我的情況下,你的幫助是ValueProvider其中t拋出異常和controller.ValueProvider = new FormCollection();做了那個測試的竅門......感謝指針 – 2011-02-04 10:19:26