需要经过身份验证的用户的单元测试 DAL
Unit testing DAL that requires authenticated user
本质上,我想做的是测试一些操作,就好像特定用户已登录并正在执行它一样。我有一个在需要审计的实体上实现的接口
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
?
只需在单元测试中使用 ClaimsPrincipal
的实例设置 Thread.CurrentPrincipal
的值。
您不需要设置假 HttpRequest
,因为您直接使用 Thread.CurrentPrincipal
。
本质上,我想做的是测试一些操作,就好像特定用户已登录并正在执行它一样。我有一个在需要审计的实体上实现的接口
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
?
只需在单元测试中使用 ClaimsPrincipal
的实例设置 Thread.CurrentPrincipal
的值。
您不需要设置假 HttpRequest
,因为您直接使用 Thread.CurrentPrincipal
。