3 messaggi dal 21 marzo 2011
Ciao a tutti,

ho un sito webform che utilizza il routing asp.net per il rewriting degli url

Le classi di RouteConfig e per la generazione dell'url si trovano nel livello di Business Logic, e sono già accessibili agli altri progetti della solution

Avrei la necessità di creare url validi per il sito, seguendone quindi le regole di routing, da altri progetti non webform della solution: sia per eseguire delle classi di test tramite NUnit, sia per creare degli url validi all'interno di servizi windows di utilità parallela al sito

In pratica vorrei poter invocare
RouteTable.Routes.GetVirtualPath()

in un contesto non web

Ovviamente per quanto riguarda NUnit potrebbero esserci soluzioni di mocking, ma il mio problema resta la creazione di un url valido all'interno del servizio windows

Grazie in anticipo per l'aiuto
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
spiega bene il motivo per cui devi comporre gli url. Non puoi semplicemente usare una stringa? Solitamente è il server stesso che informa il client su quali siano gli URL delle risorse appena inserite (es. il server può aggiungere una header Location nella risposta quando il client gli ha appena inviato un oggetto da inserire).

E' inusuale che nello unit testing si debbano fare delle chiamate HTTP per testare il proprio codice. Infatti il tuo scopo non è verificare che il routing di ASP.NET funzioni, ma testare le classi del tuo business layer.

Sanjuras ha scritto:

Le classi di RouteConfig e per la generazione dell'url si trovano nel livello di Business Logic,

Prova a portare le regole nel progetto web, che è quello responsabile della presentazione dei dati ottenuti dalla Business Logic. Dovrebbero restare ben isolati tra loro. La business logic, in particolare, deve poter funzionare sia se consumata da un sito web che da altro tipo di applicazioni.

ciao,
Moreno
Modificato da BrightSoul il 15 settembre 2014 14.33 -

Enjoy learning and just keep making
3 messaggi dal 21 marzo 2011
Ciao,

grazie per la risposta

Ho la necessità di creare url validi per il sito al di fuori del sito stesso, oltre che per testare la funzione di creazione degli url, anche per servizi tipo mail di notifica; le classiche "c'è una nuova discussione in /forum/34/ASP.NET-4.0.aspx che ti può interessare", dove ovviamente l'url non può essere frutto di una concatenazione di stringhe che duplica la logica del sito

Ad ogni modo ho trovato un workaround qui: http://forums.asp.net/post/2718242.aspx

Fondamentalmente, creando uno stub del Context si riesce a utilizzare la maggior parte dei metodi, compreso GetVirtualPath()

Da' ancora errore di nullReference su GetRouteData(), ma non si può avere tutto ;)

Grazie, ciao
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,

Sanjuras ha scritto:

Da' ancora errore di nullReference su GetRouteData(), ma non si può avere tutto ;)

guarda, forse ti può esser d'aiuto il pacchetto NuGet MvcRouteUnitTester, che crea al tuo posto uno stub di HttpContextBase, e che può andar bene anche per testare le routes legate a pagine aspx.

Questo è l'esempio di uno unit test per verificare che da un url siano estratti i valori di RouteData corretti.
//Arrange
var routes = new RouteCollection();
routes.MapPageRoute("Catalogo", "Catalogo/{Prodotto}", "~/Catalogo.aspx");
var tester = new RouteTester(routes).WithIncomingRequest("/Catalogo/Frigorifero");

//Act
var routeData = routes.GetRouteData(tester.HttpContext);

//Assert
Assert.AreEqual("Frigorifero", routeData.Values["Prodotto"]);


Mentre questo serve a verificare che con certi valori di RouteData venga poi generato l'url corretto (la stessa logica ti può anche servire per generarti gli url che chiedevi).
//Arrange
var routes = new RouteCollection();
routes.MapPageRoute("Catalogo", "Catalogo/{Prodotto}", "~/Catalogo.aspx");
var tester = new RouteTester(routes).WithIncomingRequest("/");
var routeData = new RouteData();
routeData.Values.Add("Prodotto", "Frigorifero");

//Act
var path = routes.GetVirtualPath(new RequestContext(tester.HttpContext, routeData), routeData.Values);

//Assert
Assert.AreEqual("/Catalogo/Frigorifero", path.VirtualPath);


Ovviamente tu non configurerai le route all'interno dello unit test come ho fatto io, ma coinvolgerai la configurazione che si trova nel tuo business layer.

Sanjuras ha scritto:

dove ovviamente l'url non può essere frutto di una concatenazione di stringhe che duplica la logica del sito

Certo, ma continua ad esserci qualcosa che mi sfugge: perché devi generare l'url al di fuori dell'applicazione web? Non è l'applicazione stessa che manda la mail, o che al limite delega a un componente esterno l'invio del messaggio (che lei stessa prepara)?

ciao,
Moreno
Modificato da BrightSoul il 19 settembre 2014 21.04 -

Enjoy learning and just keep making
3 messaggi dal 21 marzo 2011
Ciao,

BrightSoul ha scritto:

guarda, forse ti può esser d'aiuto il pacchetto NuGet MvcRouteUnitTester, che crea al tuo posto uno stub di HttpContextBase, e che può andar bene anche per testare le routes legate a pagine aspx.

Questo è l'esempio di uno unit test per verificare che da un url siano estratti i valori di RouteData corretti.
//Arrange
var routes = new RouteCollection();
routes.MapPageRoute("Catalogo", "Catalogo/{Prodotto}", "~/Catalogo.aspx");
var tester = new RouteTester(routes).WithIncomingRequest("/Catalogo/Frigorifero");

//Act
var routeData = routes.GetRouteData(tester.HttpContext);

//Assert
Assert.AreEqual("Frigorifero", routeData.Values["Prodotto"]);


Mentre questo serve a verificare che con certi valori di RouteData venga poi generato l'url corretto (la stessa logica ti può anche servire per generarti gli url che chiedevi).
//Arrange
var routes = new RouteCollection();
routes.MapPageRoute("Catalogo", "Catalogo/{Prodotto}", "~/Catalogo.aspx");
var tester = new RouteTester(routes).WithIncomingRequest("/");
var routeData = new RouteData();
routeData.Values.Add("Prodotto", "Frigorifero");

//Act
var path = routes.GetVirtualPath(new RequestContext(tester.HttpContext, routeData), routeData.Values);

//Assert
Assert.AreEqual("/Catalogo/Frigorifero", path.VirtualPath);



ottimo, questo sembra proprio fare al caso mio per i test, grazie mille!

BrightSoul ha scritto:

Sanjuras ha scritto:

dove ovviamente l'url non può essere frutto di una concatenazione di stringhe che duplica la logica del sito

Certo, ma continua ad esserci qualcosa che mi sfugge: perché devi generare l'url al di fuori dell'applicazione web? Non è l'applicazione stessa che manda la mail, o che al limite delega a un componente esterno l'invio del messaggio (che lei stessa prepara)?

ciao,
Moreno


no, si tratta di email non basate su azioni contestuali, ma su controlli a frequenza regolare, con notifica ad esempio settimanale: l'utente sottoscrive le notifiche per una sezione/ricerca particolare, e riceve aggiornamenti a frequenza costante.. mi risulta ci sia un sistema simile anche qui su aspitalia e penso se ne occupi un demone, non tipo che parte una mail ogni volta che un utente inserisce un nuovo post

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.