2016-12-03 8 views
1

Я создал простой фильтр действий в моем приложении ASP.NET ядра, это действие фильтра, предполагают, чтобы регистрировать активность пользователя:Как протестировать фильтр пользовательских действий в 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) 
    { 
    } 
} 

Теперь я просто хотел бы знать, как я могу писать модульные тесты для него. Я использую xUnit и Mock

+0

Mock всей необходимой зависимость, упражнение метода испытуемого, а затем проверить ожидаемое поведение в отношении фактического поведения – Nkosi

+1

в том же направлении, что Nkosi сказала, я бы следовать ААА шаблон. Arrange Act Assert Посмотрите здесь, как проверить свои контроллеры. https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/testing – DOMZE

ответ

0

Согласно вашему коду, чтобы выполнить модульный тест, вам нужно также высмеять HttpContext. Кстати, этот бит не кажется правильным: UserName = context.HttpContext.User Я полагаю, вы имели в виду UserName = context.HttpContext.User.Identity.Name. В любом случае это, как вы проверить метод должен выглядеть следующим образом:

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

Откуда появился фильтр filterContext? – lbrahim