基本上,我要做的是测试某个操作,就像特定用户已登录并执行操作一样。我有一个接口,我在需要审计的实体上实现
public interface IAuditableEntity
{
DateTime CreatedDate { get; set; }
string CreatedById{ get; set; }
DateTime UpdatedDate { get; set; }
string UpdatedById { get; set; }
}
在我的MVC项目中,我已覆盖SaveChanges()
函数以自动填写上述字段:
public override int SaveChanges()
{
var modifiedEntries = ChangeTracker.Entries()
.Where(x => x.Entity is IAuditableEntity
&& (x.State == System.Data.Entity.EntityState.Added || x.State == System.Data.Entity.EntityState.Modified));
foreach (var entry in modifiedEntries)
{
IAuditableEntity entity = entry.Entity as IAuditableEntity;
if (entity != null)
{
var identityName = (Thread.CurrentPrincipal as ClaimsPrincipal).FindFirst(ClaimTypes.NameIdentifier).Value;
DateTime now = DateTime.UtcNow;
if (entry.State == System.Data.Entity.EntityState.Added)
{
entity.CreatedById = identityName;
entity.CreatedDate = now;
}
else
{
base.Entry(entity).Property(x => x.CreatedById).IsModified = false;
base.Entry(entity).Property(x => x.CreatedDate).IsModified = false;
}
entity.UpdatedById = identityName;
entity.UpdatedDate = now;
}
}
return base.SaveChanges();
}
这在所有情况下都能完美运行,因为您需要在修改任何IAuditableEntity
实体之前登录应用程序。但是,我无法弄清楚如何对此进行单元测试。
认为我应该调用我的登录方法似乎是合理的,事情应该从那里起作用。我的登录方法基本上是:
var ctx = this.Request.GetOwinContext();
ctx.SignIn(...)
不幸的是,在测试项目中,没有Request对象。如何在单元测试范围内模拟Request
?
答案 0 :(得分:1)
只需在单元测试中设置Thread.CurrentPrincipal
的实例ClaimsPrincipal
。
您不需要设置假HttpRequest
,因为您直接使用Thread.CurrentPrincipal
。