2012-07-08 14 views
8

Ho passato già mezza giornata senza alcun successo. Come si esegue il test unitario delle rotte nell'API Web?Test unitario Route personalizzata nell'API Web

intendo dato il seguente URI:

~/Test/Get/2 

voglio unit test che l'URL di cui sopra viene catturato dal controller di test e ottenere un'azione di accettare un parametro int.

+0

potrebbe essere utile? http://stackoverflow.com/questions/10446174/httpclient-with-asp-net-webapi-in-unit-testing-scenario –

+0

e questo: http://www.peterprovost.org/blog/2012/06/16/unit-testing-asp-dot-net-web-api/ –

+0

Puoi provare a utilizzare il pacchetto NuGet MvcRouteUnitTester (funziona piuttosto facilmente) http://nuget.org/packages/MvcRouteUnitTester – Styxxy

risposta

0

Questo è quello che ho fatto, per favore fatemi sapere cosa ne pensate

[Test] 
public void Should_be_able_to_route_to_gettables_action_in_databaseschemaexplorercontroller() 
{ 
    const string url = "~/DatabaseSchemaExplorer/Tables/DatabaseType/Provider/DataSource/DatabaseName"; 

    _httpContextMock.Expect(c => c.Request.AppRelativeCurrentExecutionFilePath).Return(url); 

    var routeData = _routes.GetRouteData(_httpContextMock); 

    Assert.IsNotNull(routeData, "Should have found the route"); 
    Assert.AreEqual("DatabaseSchemaExplorer", routeData.Values["Controller"]); 
    Assert.AreEqual("Tables", routeData.Values["action"]); 
    Assert.AreEqual("DatabaseType", routeData.Values["databaseType"]); 
    Assert.AreEqual("Provider", routeData.Values["provider"]); 
    Assert.AreEqual("DataSource", routeData.Values["dataSource"]); 
    Assert.AreEqual("DatabaseName", routeData.Values["databaseName"]); 
} 
+0

Potresti pubblicare il tuo codice simulato per '_httpContexMock' e' _routes'? Ho lavorato allo stesso problema e ho posto questa domanda: http://stackoverflow.com/q/11851558/61654. – ahsteele

3

per testare i percorsi, ho creato una biblioteca per aiutarvi con l'asserzioni - MyWebApi: https://github.com/ivaylokenov/MyWebApi

In sostanza, è possibile effettuare le seguenti operazioni:

MyWebApi 
    .Routes() 
    .ShouldMap(“api/WebApiController/SomeAction/5”) 
    .WithJsonContent(@”{“”SomeInt””: 1, “”SomeString””: “”Test””}”) 
    .And() 
    .WithHttpMethod(HttpMethod.Post) 
    .To(c => c.SomeAction(5, new RequestModel 
    { 
     SomeInt = 1, 
     SomeString = “Test” 
    })); 

Se si desidera implementare da soli, si può vedere il codice qui e copiarlo: https://github.com/ivaylokenov/MyWebApi/blob/master/src/MyWebApi/Utilities/RouteResolvers/InternalRouteResolver.cs