2010-02-25 14 views
15

Je souhaite tester l'action d'indexation suivante du contrôleur ASP.NET MVC. Qu'est-ce que je remplace le paramètre réel dans l'affirmation ci-dessous (écrasé avec?).Comment tester unitairement un ActionResult renvoyant un ContentResult?

using System.Web.Mvc; 
namespace MvcApplication1.Controllers 
{ 
    public class StatusController : Controller 
    { 
     public ActionResult Index() 
     { 
      return Content("Hello World!"); 
     } 
    } 
} 


[TestMethod] 
public void TestMethod1() 
{ 
    // Arrange 
    var controller = CreateStatusController(); 

    // Act 
    var result = controller.Index(); 

    // Assert 
    Assert.AreEqual("Hello World!.", ?); 
} 

Répondre

20

Utilisez l'opérateur "as" pour créer une distribution Nullable. Ensuite, vérifiez simplement un résultat nul

[TestMethod] 
public void TestMethod1() 
{ 
    // Arrange 
    var controller = CreateStatusController(); 

    // Act 
    var result = controller.Index() as ContentResult; 

    // Assert 
    Assert.NotNull(result); 
    Assert.AreEqual("Hello World!.", result.Content); 
} 
4

test, vous ne peux pas que le résultat est non nul, que vous recevez un ContentResult et de comparer les valeurs:

[TestMethod] 
public void TestMethod1() 
{ 
    // Arrange 
    var controller = CreateStatusController(); 

    // Act 
    var result = controller.Index(); 

    // Assert 
    Assert.NotNull(result); 
    Assert.IsAssignableFrom(typeof(ContentResult), result); 
    Assert.AreEqual("Hello World!.", result.Content); 
} 

J'apoligize si le Nunit Affirme ne sont pas welformed, mais regardez comme pseudo-code :)

11

J'aime créer des aides à l'assertion pour ce genre de choses. Par exemple, vous pourriez faire quelque chose comme:

public static class AssertActionResult { 
    public static void IsContentResult(ActionResult result, string contentToMatch) { 
     var contentResult = result as ContentResult; 
     Assert.NotNull(contentResult); 
     Assert.AreEqual(contentToMatch, contentResult.Content);   
    } 
} 

Vous souhaitez alors appelez cela comme:

[TestMethod] 
public void TestMethod1() 
{ 
    var controller = CreateStatusController(); 
    var result = controller.Index(); 

    AssertActionResult.IsContentResult(result, "Hello World!");  
} 

Je pense que cela fait des tests beaucoup plus facile à lire et à écrire.

+0

C'est une bonne idée Seth. J'ai un certain nombre de tests unitaires ContentResult à coder, ce qui aidera à garder la philosophie DRY. –

+0

@Nicholas: Je suis content que vous l'ayez trouvé utile. Les autres helpers que j'ai sont 'AssertActionResult.IsRedirectTo (result, url)' et 'AssertActionResult.IsViewResult (result, viewName)'. –