Testen WebApi Controller Url.Link
Habe ich folgende controller-action
public void Post(Dto model)
{
using (var message = new MailMessage())
{
var link = Url.Link("ConfirmAccount", new { model.Id });
message.To.Add(model.ToAddress);
message.IsBodyHtml = true;
message.Body = string.Format(@"<p>Click <a href=""{0}"">here</a> to complete your registration.<p><p>You may also copy and paste this link into your browser.</p><p>{0}</p>", link);
MailClient.Send(message);
}
}
Um dies zu testen, die ich brauche, um das setup den controller-context
var httpConfiguration = new HttpConfiguration(new HttpRouteCollection { { "ConfirmAccount", new HttpRoute() } });
var httpRouteData = new HttpRouteData(httpConfiguration.Routes.First());
var httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, "http://localhost");
sut = new TheController
{
ControllerContext = new HttpControllerContext(httpConfiguration, httpRouteData, httpRequestMessage),
MailClient = new SmtpClient { PickupDirectoryLocation = location }
};
Dies scheint wie eine Menge von setup zu testen, die Erstellung von einem link. Gibt es eine bessere Möglichkeit, dies zu tun? Ich habe gelesen, über in-memory-Server, sondern, wie es aussieht, gilt mehr für die httpclient, der über die Prüfung der Steuerung direkt.
- +1 ich dachte, der ganze Punkt von REST services ermöglichen linkable Ressourcen. Ich bin wirklich unglücklich mit der WebAPI Link/Url utilities. Die Referenzierung der route name scheint so zerbrechlich und die Tests, die Geschichte ist ebenso schmerzhaft. Hoffentlich gibt es einige Verbesserungen kommen...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich begann mit diesem Ansatz, mit Web-API 2.0.
Wenn Sie mit einem spöttischen Bibliothek (und Sie sollten wirklich für alle real world unit-tests), Sie sind in der Lage, direkt zu verhöhnen die
UrlHelper
Objekt alle Methoden sindvirtual
.Ist das eine viel sauberere Lösung als Ben Foster ' s Antwort, wie mit diesem Konzept, müssen Sie Routen hinzufügen, um die Konfiguration für jeden Namen, den Sie verwenden. Das könnte sich leicht ändern, oder eine lächerlich große Anzahl von Routen einrichten.
Unten ist das absolute minimum an code erforderlich, um zu testen
UrlHelper
ohne jede Art von mocking-library. Die Sache, die warf mich (und hat mich einige Zeit auf die Spur), dass Sie benötigen, um dieIHttpRouteData
von der Anfrage. Wenn Sie nicht dieIHttpRoute
Instanz nicht generieren einen virtuellen Pfad, was eine leere URL.ControllerContext
Eigenschaft vonFooController
einschließlich seinerControllerDescriptor
. Ich erbte diesen code und bin nicht sicher, welche Version der web-api, die ich verwende, aber es ist MVC 4.Ich in die gleiche Idiotie. Alle Referenzen, die ich finden kann, wollen Sie zu Verspotten die Anforderung/Steuerung, die (wie gesagt) eine Menge Arbeit.
Besondere Hinweise:
Habe ich nicht bekommen, um zu versuchen, die tatsächliche Mocking-frameworks, so habe ich eine helper-Klasse zu "bauen" meinen controller. Also anstatt
Verwende ich etwas wie:
Referenz, die Methode ist im Grunde: