Mvcontrib.MVC3.Testhelper UpdateModel NullReferenceExceuption während des Komponententests
-
28-10-2019 - |
Frage
Ich versuche, eine Bearbeitungsaktion auf meinem Controller in ASP.NET MVC 3 zu testen.
Ich habe Mvcontrib.MVC3.TestHelper über Nuget installiert, um meinen Controller-Kontext zu verspotten, erhalte aber immer noch eine NullReferenceException
Mein Code sieht folgendermaßen aus:
[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());
}
Der Produktionscode sieht folgendermaßen aus ...
[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);
}
Und selbst wenn ich UpdateModel oder TryUpdateModel verwende, stürzt es immer mit einer NullReferenceException ab ...
Jede Hilfe, Hinweise wären fantastisch ...
Lösung
So können Sie vorgehen:
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);
}
}
und der 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());
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow