如何测试ASP.NET Core中的自定义操作筛选器? [英] How to test custom action filter in ASP.NET Core?
本文介绍了如何测试ASP.NET Core中的自定义操作筛选器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我已经在ASP.NET核心应用程序中创建了一个简单的操作筛选器,此操作筛选器应该记录用户的活动:
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
推荐答案
根据您的代码,要进行单元测试,您还需要模拟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();
}
这篇关于如何测试ASP.NET Core中的自定义操作筛选器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文