2016-12-03 7 views
1

ich ein einfaches Action-Filter in meinem ASP.NET Core-Anwendung erstellt haben, diese Aktion Filter wird angenommen, Benutzer-Aktivität zu protokollieren:So testen Sie benutzerdefinierte Aktionsfilter in ASP.NET Core?

public class AuditAttribute : IResultFilter 
{ 
    private readonly IAuditService _audit; 
    private readonly IUnitOfWork _uow; 
    public AuditAttribute(IAuditService audit, IUnitOfWork uow) 
    { 
     _audit = audit; 
     _uow = uow; 
    } 
    public void OnResultExecuting(ResultExecutingContext context) 
    { 
     ar model = new Audit 
     { 
      UserName = context.HttpContext.User, 
      //... 
     }; 
     _audit.Add(model); 
     _uow.SaveChanges(); 
    } 
    public void OnResultExecuted(ResultExecutedContext context) 
    { 
    } 
} 

Jetzt wollte ich nur wissen, wie kann ich Unit-Tests für sie schreiben. Ich verwende xUnit und Mock

+0

Mock all notwendigen Abhängigkeiten, die Methode im Test ausübt und dann erwartetes Verhalten gegen tatsächliches Verhalten – Nkosi

+1

In der gleichen Richtung überprüfen, ob Nkosi sagte, ich würde das AAA folgen Muster. Arrange Act Assert Sehen Sie hier, wie Sie Ihre Controller testen können https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/testing – DOMZE

Antwort

0

Nach Ihrem Code, Unit-Test zu tun, müssen Sie auch den HttpContext verspotten. BTW dieses Bit scheint nicht richtig: UserName = context.HttpContext.User Ich nehme an, Sie meinten UserName = context.HttpContext.User.Identity.Name. Wie auch immer das ist, wie Sie die Methode testen soll wie folgt aussehen:

public void OnResultExecuting_Test() 
{ 
    // Arrange sesction : 
    var httpContextWrapper = new Moq<HttpContextBase>(); 
    var genericIdentity = new GenericIdentity("FakeUser","AuthType"); 
    var genericPrincipal = new GenericPrincipal(genericIdentity , new string[]{"FakeRole"}); 
    httpContextWrapper.Setup(o=> o.User).Return(genericPrincipal); 
    var controller = new FakeController(); // you can define a fake controller class in your test class (should inherit from MVC Controller class) 
    controller.controllerContext = new ControllerContext(httpContextWrapper.Object, new RouteData(), controller); 
    var audit = new Moq<IUnitOfWork>(); 
    var uow = new Moq<IAuditService>(); 
    // more code here to do assertion on audit 
    uow.Setup(o=>o.SaveChanges()).Verifiable(); 
    var attribute= new AuditAttribute(audit.Object,uow.Object); 

    // Act Section: 
    attribute.OnActionExecuting(filterContext); 

    // Assert Section: 
    ... // some assertions 
    uow.Verify(); 

} 
+1

Woher kam der 'filterContext'? – lbrahim

Verwandte Themen