Ich habe einen Controller in C #, der das ASP.Net MVC-Framework verwendet
public class HomeController:Controller{
public ActionResult Index()
{
if (Request.IsAjaxRequest())
{
//do some ajaxy stuff
}
return View("Index");
}
}
Ich bekam einige Tipps zum Verspotten und hoffte, den Code mit den folgenden und RhinoMocks testen zu können
var mocks = new MockRepository();
var mockedhttpContext = mocks.DynamicMock<HttpContextBase>();
var mockedHttpRequest = mocks.DynamicMock<HttpRequestBase>();
SetupResult.For(mockedhttpContext.Request).Return(mockedHttpRequest);
var controller = new HomeController();
controller.ControllerContext = new ControllerContext(mockedhttpContext, new RouteData(), controller);
var result = controller.Index() as ViewResult;
Assert.AreEqual("About", result.ViewName);
Ich erhalte jedoch immer wieder diesen Fehler:
Ausnahme System.ArgumentNullException: System.ArgumentNullException: Wert darf nicht null sein. Parametername: Anforderung bei System.Web.Mvc.AjaxRequestExtensions.IsAjaxRequest (HttpRequestBase-Anforderung)
Seit der Request
Objekt auf der Steuerung keinen Setter hat. Ich habe versucht, diesen Test ordnungsgemäß zu verwenden, indem ich den empfohlenen Code aus einer Antwort unten verwendet habe.
Dies verwendete Moq anstelle von RhinoMocks, und bei der Verwendung von Moq verwende ich Folgendes für denselben Test:
var request = new Mock<HttpRequestBase>();
// Not working - IsAjaxRequest() is static extension method and cannot be mocked
// request.Setup(x => x.IsAjaxRequest()).Returns(true /* or false */);
// use this
request.SetupGet(x => x.Headers["X-Requested-With"]).Returns("XMLHttpRequest");
var context = new Mock<HttpContextBase>();
context.SetupGet(x => x.Request).Returns(request.Object);
var controller = new HomeController(Repository, LoginInfoProvider);
controller.ControllerContext = new ControllerContext(context.Object, new RouteData(), controller);
var result = controller.Index() as ViewResult;
Assert.AreEqual("About", result.ViewName);
aber erhalte den folgenden Fehler:
Ausnahme System.ArgumentException: System.ArgumentException: Ungültiges Setup für ein nicht überschreibbares Mitglied: x => x.Headers ["X-Requested-With"] bei Moq.Mock.ThrowIfCantOverride (Ausdrucksetup, MethodInfo methodInfo)
Wieder scheint es, als könnte ich den Anforderungsheader nicht setzen. Wie setze ich diesen Wert in RhinoMocks oder Moq?
Antworten:
Verwenden von Moq :
AKTUALISIERT:
Mock
Request.Headers["X-Requested-With"]
oderRequest["X-Requested-With"]
stattRequest.IsAjaxRequest()
.quelle
Für jeden, der NSubstitute verwendet, konnte ich die obigen Antworten ändern und so etwas tun ... (wobei Details der Name der Aktionsmethode auf dem Controller ist)
quelle
Hier ist eine funktionierende Lösung mit RhinoMocks. Ich habe es auf einer Moq-Lösung basiert, die ich unter http://thegrayzone.co.uk/blog/2010/03/mocking-request-isajaxrequest/ gefunden habe.
quelle
Ist AjaxRequest ist eine Erweiterungsmethode. Mit Rhino können Sie dies folgendermaßen tun:
quelle
Sieht so aus, als ob Sie danach suchen,
Verwendung in Controller:
quelle
Sie müssen HttpContextBase verspotten und wie folgt in Ihre ControllerContext-Eigenschaft einfügen:
quelle
Um
IsAjaxRequest()
während des Komponententests false zurückzugeben, müssen Sie die Anforderungsheader sowie den Anforderungserfassungswert in Ihrer Testmethode wie folgt einrichten:Der Grund für das Einrichten von beiden ist in der Implementierung von IsAjaxRequest () verborgen, die unten angegeben ist:
Es werden sowohl Anforderungssammlung als auch Header verwendet. Aus diesem Grund müssen wir ein Setup für Header und Anforderungssammlung erstellen.
Dadurch wird die Anforderung, false zurückzugeben, wenn es sich nicht um eine Ajax-Anforderung handelt. Damit es wahr wird, können Sie Folgendes tun:
quelle
Ich habe eine andere Möglichkeit gefunden, ein HttpRequestMessage-Objekt während der Web-API wie folgt zu Ihrer Anfrage hinzuzufügen
quelle
(Ein bisschen spät zur Party, aber ich bin einen anderen Weg gegangen, also dachte ich, ich würde teilen)
Um dies zu testen, ohne Mocks für HTTP-Klassen zu erstellen, habe ich einen IControllerHelper implementiert, der über eine Initialisierungsmethode verfügt, die die Anforderung als Parameter verwendet und dann die gewünschten Eigenschaften verfügbar macht, z.
Dann rufe ich in meinem Controller zu Beginn der Methode initialise auf:
Und dann ist mein Code nur von spöttischen Abhängigkeiten abhängig.
Für Funktionstests überschreibe ich einfach den iControllerHelper in der Komposition als Ersatz.
quelle