2010-02-25 1 views
15

Voglio testare l'azione di indice del controller ASP.NET MVC seguente. Che cosa sostituisco il parametro attuale nell'asserzione sottostante (con stubato?).Come testare un'unità ActionResult che restituisce 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!.", ?); 
} 

risposta

20

utilizzare l'operatore "as" per creare un cast nullable. Quindi controlla semplicemente un risultato nullo

[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

Si prova gergo che il risultato non è nullo, che si riceve un ContentResult e confrontare i valori:

[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); 
} 

ho apoligize se la Nunit asserisce non sono welformed, ma guardare ad esso come pseudo-codice :)

11

Mi piace creare assistenti di asserzione per questo genere di cose. Ad esempio, si potrebbe fare qualcosa di simile:

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);   
    } 
} 

Farebbe quindi chiama questo tipo:

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

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

Penso che questo rende i test in modo molto più facile da leggere e scrivere.

+0

Questa è una grande idea di Seth. Ho un bel po 'di test delle unità ContentResult da codificare, quindi questo aiuterà a cercare di mantenere la filosofia di DRY. –

+0

@Nicholas: Sono contento che tu l'abbia trovato utile. Altri helper che ho sono 'AssertActionResult.IsRedirectTo (result, url)' e 'AssertActionResult.IsViewResult (result, viewName)'. –