2010-02-19 5 views
5

Ich verwende Moq für Komponententests und möchte das Attribut einer Ansicht testen. In diesem Fall das Autorize-Attribut.Komponententest für ein Ansichtsattribut mit Moq

Beispiel Codes anzeigen:

[Authorize(Roles = "UserAdmin")] 
public virtual ActionResult AddUser() 
{ 
    // view logic here 
    return View(); 
} 

So würde Ich mag die Ansicht Attribut testen, wenn ich auf dieser Ansicht mit einem Benutzer handeln, der in der Rolle des Admin ist und ein Benutzer, der nicht in der Rolle von Benutzer admin. Gibt es das überhaupt, um das zu tun?

Beispiel Test:

[Test] 
public void Index_IsInRole_Customer() 
{ 
    // Arrange 
    UserAdminController controller = _controller; 
    rolesService.Setup(r => r.IsUserInRole(It.IsAny<string>(), It.IsAny<string>())).Returns(false); // return false for any role 

    // Act 
    var result = controller.AddUser(); 

    // Assert 
    Assert.IsNotNull(result, "Result is null"); 
} 

Antwort

9

Attribute sind nur Metadaten zum Typ, also tun sie nichts, wenn die umgebende Infrastruktur sie nicht dazu bringt, etwas zu tun (oder noch besser: die umgebende Infrastruktur tut etwas basierend auf den Informationen in diesen Attributen). Das macht das ASP.NET MVC-Framework, wenn es eine Anfrage ausführt.

Das ist nicht das, was Sie tun, wenn Sie eine Controller-Aktion in einem Komponententest erstellen und aufrufen, es sei denn, Sie möchten die Controller-Aktion mit einem ControllerActionInvoker aufrufen (zu diesem Zeitpunkt hört der Test auf) Unit-Test und wird zu einem Integrationstest) Sie können das Verhalten, das durch das Attribut impliziert wird, nicht direkt testen.

können Sie schreiben jedoch eine Einheit Test, der überprüft, ob das Attribut korrekt die Controller Aktion verziert:

var attributes = typeof(UserAdminController) 
    .GetMethod("AddUser").GetCustomAttributes(true); 
var result = attributes.OfType<AuthorizeAttribute>().Single(); 
Assert.AreEqual("UserAdmin", result.Roles); 
+0

Ja, vielleicht sollte meine Frage gewesen sein, * sollte * ich teste die Wirkung zuschreibt. aber nette antwort danke kumpel! +1 – Gabe

+0

Ich habe noch eine Frage ... Was passiert, wenn ich zwei Aktionen mit dem gleichen Namen habe, wenn ein GET und ein Post ist .... Wenn ich GetMethod verwende, erhalte ich einen Fehler für mehrdeutige Ergebnisse gefunden. Wie kann ich unterscheiden? – Gabe

+1

@gmcalab: Dann müssen Sie die Überladung 'GetMethod (string, Type [])' verwenden. –

1

Wenn der Test über den AuthorizeAttribute Ausführung nicht berücksichtigt werden (das heißt, niemand wird es bewerten). Dies liegt normalerweise in der Verantwortung von ControllerActionInvoker (einer Klasse in System.Web.Mvc).

Sie können nur darauf vertrauen, dass AuthorizeAttribute korrekt implementiert ist. Verwenden Sie dann nur die Reflektion, um zu überprüfen, ob das AuthorizeAttribute für Ihre Aktion korrekt definiert wurde.