Question

J'essaie de tester une action de modification sur mon contrôleur dans ASP.NET MVC 3.

J'ai installé mvContrib.mvc3.Testhelper via Nuget pour se moquer de mon contexte de contrôleur, mais je reçois toujours une 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());
    }

Le 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 j'utilise UpdateModel ou TryuPDateModel, il se bloque toujours avec une nullReferenceException ...

Toute aide, les pointeurs seraient fantastiques ...

Était-ce utile?

La solution

Voici comment vous pourriez continuer:

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());
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top