3

Je suis en train de tester une unité action d'édition sur mon contrôleur dans ASP.NET MVC 3.Mvcontrib.MVC3.Testhelper UpdateModel NullReferenceExceuption pendant l'unité de test

J'ai installé Mvcontrib.MVC3.TestHelper via NuGet pour se moquer de mon contrôleur contexte, mais je reçois toujours un NullReferenceException

mon code ressemble à ceci:

[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()); 
    } 

code de production ressemble à ceci ...

[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); 
    } 

Et même si je l'utilise UpdateModel ou TryUpdateModel il se bloque alwas avec un NullReferenceException ...

Toute aide, pointers serait fantastique ...

Répondre

5

Voici comment pouvait-il procéder:

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); 
    } 
} 

et le test:

// 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

Merci pour votre aide dans mon cas, il était ValueProvider qui t hrows l'exception et controller.ValueProvider = new FormCollection(); a fait l'affaire pour ce test ... Merci pour le pointeur –

+0

Je cherchais depuis un moment maintenant. ValueProvider était la clé! – Dann

Questions connexes