单元测试需要经过身份验证的用户的DAL

时间:2015-04-14 16:15:15

标签: c# asp.net-mvc entity-framework unit-testing asp.net-identity

基本上,我要做的是测试某个操作,就像特定用户已登录并执行操作一样。我有一个接口,我在需要审计的实体上实现

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

1 个答案:

答案 0 :(得分:1)

只需在单元测试中设置Thread.CurrentPrincipal的实例ClaimsPrincipal

您不需要设置假HttpRequest,因为您直接使用Thread.CurrentPrincipal