需要经过身份验证的用户的单元测试 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