Comment puis-je tester l'affichage par défaut lors de l'utilisation T4MVC avec MvcContrib.TestHelper AssertViewRendered

StackOverflow https://stackoverflow.com/questions/9310828

Question

J'utilise T4MVC dans mon projet ASP.NET MVC 3. J'ai le test de base suivant:

[TestMethod]
public void IndexReturnsIndexView()
{
    var controller = new HomeController();
    var result = controller.Index();

    result.AssertViewRendered().ForView(MVC.Home.Views.Index);
}

Le test échoue si la méthode du contrôleur retourne la vue par défaut:

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

L'erreur donnée est:

MvcContrib.TestHelper.ActionResultAssertionException: Expected view name '~/Views/Home/Index.cshtml', actual was ''

Mais le test passe si je le View passer outre pour spécifier viewName à un retour:

public virtual ActionResult Index()
{
    return View(MVC.Home.Views.Index);
}

J'ai essayé d'utiliser l'affirmation suivante, mais toujours pas de chance:

result.AssertViewRendered().ForView(MVC.Home.Index().GetT4MVCResult().Action);

L'erreur suivante est soulevée:

MvcContrib.TestHelper.ActionResultAssertionException: Expected view name 'Index', actual was ''

Je me suis alors rendu compte que je l'avais mal interprété l'échec d'assertion, alors j'ai changé le test à ceci:

result.AssertViewRendered().ForView(String.Empty);

Le test passe, mais le test lui-même semble être inutile.

De préférence Je ne veux pas avoir à spécifier toutes les vues par nom, alors comment puis-je tester cela? Pour clarifier, j'utilise le MvcContrib.Mvc3.TestHelper-ci 3.0.96.0 , que j'ai installé aujourd'hui NuGet.

UPDATE

Ce n'est pas une réponse à la question, mais je l'ai commencé à faire ce qui suit à la place, qui fournit plus de valeur en cas de test:

using (var controller = new FeatureController(mockGateway))
{
    // Act
    var result = controller.Index();
    var model = result.ViewData.Model as MyModel;

    // Assert
    Assert.IsNotNull(model, "Model is null or wrong type");
    result.AssertViewRendered().WithViewData<MyModel>();

    // Alternative Assert for model data
    Assert.IsTrue(model.Items.Count > 0);
}
Était-ce utile?

La solution

Je laisse cette ouverture pour une quantité considérable de temps, de sorte que quelqu'un d'autre pourrait répondre si elles le voulaient. Je vais maintenant répondre à moi-même.

Les contrôles suivants pour vous assurer que la vue renvoyée contient le modèle attendu, et de manière plus appropriée des données dans ce modèle. Ceci est un bien meilleur test unitaire pour le contrôleur en question.

using (var controller = new FeatureController(mockGateway))
{
    // Act
    var result = controller.Index();
    var model = result.ViewData.Model as MyModel;

    // Assert
    Assert.IsNotNull(model, "Model is null or wrong type");
    result.AssertViewRendered().WithViewData<MyModel>();

    // Alternative Assert for model data
    Assert.IsTrue(model.Items.Count > 0);
}

Autres conseils

AssertViewRendered (). Les tests ForView () contre le nom de la vue que vous passez explicitement à la vue () est votre action de contrôleur. Si, comme vous le faites, vous ne spécifiez pas de nom de la vue dans votre action, puis .ForView () va tester contre une chaîne vide, comme vous l'avez vu.

Si vous avez appelé View ( "indice"); dans votre action, vous pouvez appeler .ForView ( "indice") dans votre test.

Je pense que cette affirmation serait plus utile si votre action pourrait revenir différents points de vue possibles.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top