Question

J'utilise ASP.NET MVC 3, MVCContrib, NUnit et Rhino Mocks.J'ai posté ceci mais je n'ai pas pu obtenir de réponse.Les gens se concentrent davantage sur mon codage, ce qui m'aide à obtenir une réponse décente pour réussir ce test.

J'essaie de tester ma vue Modifier.Je ne sais pas comment coder le test pour la vue.Il s'agit d'une vue fortement typée de type NewsEditViewData.

Lorsque la vue se charge, elle obtient les données d'un élément d'actualité par ID du service d'actualités.Ainsi, lors de mon test, j'ai créé un stub du service de presse :

var id = 1;
var news = new News();
newsServiceStub
   .Stub(x => x.FindById(id))
   .Return(news);

Je dois maintenant mapper cet élément d'actualité à NewsEditViewData.J'ai un mappeur (AutoMapper) qui fait cela pour moi, et lors de mon test, j'ai fait ce qui suit :

newsMapperStub
   .Stub(x => x.Map(news, typeof(News), typeof(NewsEditViewData)))
   .Return(newsEditViewData);

Je ne sais pas si je suis sur la bonne voie jusqu'à présent ?

J'ai alors le bout de code suivant :

// Act
var actual = sut.Edit(id);

Ne travaillez pas à partir de mon code, je veux une réponse suivant les meilleures pratiques.Alors, que dois-je vérifier dans ma partie assert ?Dois-je également vérifier qu'un dossier a été renvoyé ?Je pensais à quelque chose comme :

actual
   .AssertViewRendered()
   .WithViewData<NewsEditViewData>()
   .ShouldBe(newsEditViewData);

Cela échoue.Quelqu'un peut-il m'aider à réécrire ce test afin qu'il réussisse.Je veux qu'il vérifie tout ce qui doit être vérifié.

Voici le test complet :

[Test]
public void Edit_should_render_Edit_view()
{
   // Arrange
   var id = 1;
   var news = new News();
   var newsEditViewData = new NewsEditViewData();

   newsServiceStub
      .Stub(x => x.FindById(id))
      .Return(news);

   newsMapperStub
      .Stub(x => x.Map(news, typeof(News), typeof(NewsEditViewData)))
      .Return(newsEditViewData);

   // Act
   var actual = sut.Edit(id);

   // Assert
   actual
      .AssertViewRendered()
      .WithViewData<NewsEditViewData>()
      .ShouldBe(newsEditViewData);
}

MISE À JOUR 2011-02-14 :

Dans mon NewsController, j'ai ce qui suit :

private INewsService newsService;
private IMapper newsMapper;

public NewsController(INewsService newsService)
{
   Check.Argument.IsNotNull(newsService, "newsService");

   this.newsService = newsService;
   newsMapper = new NewsMapper();  // TODO: Use dependency injection
}

La méthode d'action ressemble à ceci :

public ActionResult Edit(int id)
{
   Check.Argument.IsNotZeroOrNegative(id, "id");

   var news = newsService.FindById(id);
   var newsEditViewData = (NewsEditViewData)newsMapper.Map(news, typeof(News), typeof(NewsEditViewData));

   return View(newsEditViewData);
}

L'erreur que j'obtiens dans NUnit est la suivante :

MyProject.Web.UnitTests.Controllers.NewsControllerTests.Edit_RenderView_EditView :MvcContrib.TestHelper.AssertionException :était MyProject.Web.Common.ViewData.NewsEditViewData mais attendait MyProject.Web.Common.ViewData.NewsEditViewData

Était-ce utile?

La solution

Vous n'avez montré aucun de vos contrôleurs, référentiels et modèles.C'est une question à laquelle il est presque impossible de répondre sans ces informations.Alors commençons à deviner.Vous disposez d'un modèle et d'un modèle de vue :

public class News { }
public class NewsEditViewData { }

Je les laisse sans aucune propriété pour les besoins de cet article.Ensuite, vous disposez probablement d'un service chargé de récupérer et de sauvegarder votre modèle (le modèle de vue ne doit jamais apparaître comme argument d'entrée/sortie de votre couche de service).Le service ne devrait jamais connaître le modèle de vue :

public interface INewsService
{
    News FindById(int id);
    void CreateNews(News news);
}

Alors vous avez probablement un mappeur :

public interface IMapper
{
    object Map(object source, Type sourceType, Type destinationType);
}

Et enfin je suppose que vous avez un contrôleur que vous essayez de tester :

public class NewsController : Controller
{
    private readonly INewsService _newsService;
    private readonly IMapper _newsMapper;

    public NewsController(INewsService newsService, IMapper newsMapper)
    {
        _newsService = newsService;
        _newsMapper = newsMapper;
    }

    public ActionResult Edit(int id)
    {
        // WARNING: Meaningless action ahead as it retrieves some
        // model from the service and passes this model to
        // the service back again for update. In the meantime
        // the model is converted to a view model using a mapper
        // and passed to the view. So totally meaningless in a real 
        // application but let's consider for the purpose of this demonstration
        var news = _newsService.FindById(id);
        _newsService.CreateNews(news);
        var newsEditViewData = (NewsEditViewData)_newsMapper.Map(news, typeof(News), typeof(NewsEditViewData));
        return View(newsEditViewData);
    }
}

OK, jusqu'ici, c'est vous qui auriez dû fournir cette information.

Et maintenant je peux commencer à répondre à votre question sur le test unitaire qui pourrait ressembler à ceci :

[Test]
public void Edit_should_fetch_news_model_from_service_given_an_id_parameter_create_news_and_pass_a_viewmodel_to_the_view()
{
    // arrange
    // TODO : move this part in the initialization section 
    // of your unit test to avoid repeating it on each method
    var newsServiceStub = MockRepository.GenerateStub<INewsService>();
    var newsMapperStub = MockRepository.GenerateStub<IMapper>();
    var sut = new NewsController(newsServiceStub, newsMapperStub);
    new TestControllerBuilder().InitializeController(sut);

    var news = new News();
    var id = 123;
    var newsEditViewData = new NewsEditViewData();
    newsServiceStub
        .Stub(x => x.FindById(id))
        .Return(news);

    newsMapperStub
        .Stub(x => x.Map(news, typeof(News), typeof(NewsEditViewData)))
        .Return(newsEditViewData);

    // act
    var actual = sut.Edit(id);

    // assert
    actual
        .AssertViewRendered()
        .WithViewData<NewsEditViewData>()
        .ShouldBe(newsEditViewData);
    newsServiceStub.AssertWasCalled(x => x.CreateNews(news));
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top