2010-02-10 10 views
5

Ich teste gerade meine Anwendung und versuche, herauszufinden, wie man einen benutzerdefinierten URL-Referrer erstellt. Ich habe versucht, es hart zu programmieren, aber ich bekomme einen Fehler, dass es schreibgeschützt ist. Hier ist, was ich versucht habe, so weit:Erstellen eines Pseudo-URL-Referrers in ASP.Net MVC für Komponententests

fakeController.HttpContext.Request.UrlReferrer.AbsolutePath = "http://www.yahoo.com"; 

sowie

fakeController.Request.UrlReferrer = "http://www.yahoo.com"; 

ich gesucht haben das Web für einige Ideen, wie eine gefälschte/Mock URL Referrer für meine Fälschung zu schaffen Controller, aber hatten kein Glück. Irgendwelche Vorschläge sind willkommen.

Hinweis: Ich verwende die integrierten Testeinheiten von Visual Studios.

UPDATE:

Danke alle für Ihre Anregungen so weit würde ich mehr als bereit sein, jede andere Einheit Testsystem zu verwenden, außerhalb von Visual Studio, leider hier bei meiner Arbeit sind wir nur erlaubt, Visual Studio zu verwenden Eingebautes System, also muss ich mit dem arbeiten, was ich habe. Danke aber, es ist gut zu wissen, dass diese Möglichkeiten da draußen sind.

Antwort

1

Ich empfehle, zu einem Mock-Framework wie NMock oder Rhino Mock zu wechseln, mit dem Sie diese erstellen können, und gibt einen bestimmten Wert für einen bestimmten Aufruf zurück, z. B. die Methode get in dieser Eigenschaft.

7

Erstellen Sie eine Scheinanforderung für den HttpContext, und richten Sie dann eine Erwartung für die Anforderung ein, die einen Uri zurückgibt. Beispiel mit RhinoMocks.

var context = MockRepository.GenerateMock<HttpContextBase>(); 
var request = MockRepository.GenerateMock<HttpRequestBase>(); 
request.Expect(r => r.UrlReferrer).Returns(new Uri("http://www.yahoo.com")).Repeat.AtLeastOnce(); 
context.Expect(c => c.Request).Returns(request).Repeat.Any(); 

fakeController.HttpContext = context; 
+0

+1 Ich begann Moq mit einer ähnlichen Antwort zu geben, aber sie schlugen mich, um es –

+0

hey tvanfosson, versucht Herumspielen mit Dieses Code-Snippet, aber ich bekomme und Fehler für context.Expect() Argument '1': kann nicht von 'System.Web.HttpRequestBase' zu 'System.Web.HttpRequest' konvertieren – kingrichard2005

1

Sie werden einen ganzen Mock HttpContext erstellen müssen, um dies leider zu erreichen. Anstatt dies hart zu kodieren, würde ich sehr empfehlen, Mocks zu verwenden, da Sie dadurch vermeiden können, Teile des Objekts zu erstellen, die Sie eigentlich nicht benötigen.

Ich würde vorschlagen, Scott Hanselmann's MvcMockHelpers Beitrag zu überprüfen, um eine Vorstellung davon zu bekommen, was beteiligt ist (es enthält Code für beide Rhino und Moq).

2

tvanfosson Antwort ist in die richtige Richtung, aber ist ein wenig veraltet. (Zugegeben OP nicht MOQ nutzen könnten, für zukünftige Referenz hinzugefügt)

// Dependency Mocks initialization .... 
    .... 
    MyController controller = new MyController(mock.Object, ...dependencies...); 

    var context = new Mock<HttpContextBase>(); 
    var request = new Mock<HttpRequestBase>(); 
    request.Setup(r => r.UrlReferrer).Returns(new Uri("http://www.site.com")); 
    context.Setup(c => c.Request).Returns(request.Object); 

    // Setting the HttpContext 
    // HttpContext is read-only, but it is actually derived from the 
    // ControllerContext, which you can set. 
    controller.ControllerContext = new ControllerContext(context.Object, 
     new RouteData(), controller); 
    //target.HttpContext = context.Object; // outdated 

HttpContext from Controller context

Verwandte Themen