向用户添加角色,获得SQL超时

时间:2018-01-04 21:25:40

标签: c# asp.net-web-api integration-testing owin localdb

在我的应用程序(MVC / WebAPI,使用Owin)中,我使用localDB设置了集成测试。在我的一个测试中,我似乎能够从UserManager查询数据,但我无法更新任何数据。

ApplicationUserManager设置:

public class ApplicationUserManager : UserManager<ApplicationUser>
{
    public ApplicationUserManager(IUserStore<ApplicationUser> store) : base(store)
    {
        UserValidator = new UserValidator<ApplicationUser>(this)
        {
            AllowOnlyAlphanumericUserNames = false,
            RequireUniqueEmail = true
        };

        PasswordValidator = new PasswordValidator
        {
            RequiredLength = 6,
            RequireNonLetterOrDigit = true,
            RequireDigit = true,
            RequireLowercase = true,
            RequireUppercase = true,
        };

        UserLockoutEnabledByDefault = true;
        DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(5);
        MaxFailedAccessAttemptsBeforeLockout = 5;
    }
}

Unity设置:

container
    .RegisterType<DbContext, ApplicationDbContext>()
    .RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>()
    .RegisterType<IAuthenticationManager>(new InjectionFactory(o => HttpContext.Current.GetOwinContext().Authentication))
    .RegisterType<IRoleStore<IdentityRole, string>, RoleStore<IdentityRole, string, IdentityUserRole>>()
    .RegisterType<ApplicationUserManager>()
    .RegisterType<ApplicationSignInManager>()
    .RegisterType<ApplicationRoleManager>()

正在测试的代码:

//Working
var user = await _applicationUserManager.FindByIdAsync(userId);
//SQL timeout
identityResult = await _applicationUserManager.AddToRoleAsync(user.Id, Roles.User);

我已尝试过其他更新(例如更新用户名),但似乎没有任何更新。当我在使用网站时调用相同的功能(或使用Postman进行API调用)时,一切正常。

有什么建议吗?

更新1:

当我将sql超时设置提高到180秒时,我能够通过第一次usermanager更新(等待大约60秒后)。以下对数据库的调用失败,提供程序在打开时失败。

更新2:

我用同样的方法测试了localdb的性能:

for (int i = 0; i < 1000; i++)
{
    _test.LogError(new System.Exception(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString());
}

此操作(1000个不同数据的插入)大约需要1秒钟才能完成。

更新3:

当我在更新用户后暂停测试时,我无法再访问SSMS中的数据库了。它似乎处于锁定状态。

更新4:

出于测试目的,我自己在用户管理器中编写了更新代码。我不再有超时,但它似乎保持连接或事务处于打开状态。在运行以下代码时,我似乎无法从SSMS中的用户表中选择任何内容。

var userToUpgrade = _context.Users.Single(user => user.Id == userId);

foreach (var role in userToUpgrade.Roles.ToList())
{
    userToUpgrade.Roles.Remove(role);
}

userToUpgrade.Roles.Add(new IdentityUserRole
{
    UserId = userId,
    RoleId = _context.Roles.Single(role => role.Name == Roles.TestUser).Id
});

_context.Entry(userToUpgrade).State = EntityState.Modified;
_context.SaveChanges();

1 个答案:

答案 0 :(得分:0)

那太愚蠢了。

更改了以下代码:

internal void StartTestScope()
{
    _transactionScope = new TransactionScope();
}

要:

internal void StartTestScope()
{
    TransactionOptions options = new TransactionOptions();
    options.IsolationLevel = IsolationLevel.ReadUncommitted;
    _transactionScope = new TransactionScope(TransactionScopeOption.RequiresNew, options);
}

在开始我的集成测试之前,我开始一个新的范围/事务。运行测试后,我把它撕下来。 usermanager在内部启动了自己的事务,导致我无法读取更改。

感谢您的建议,帮助我朝着正确的方向前进!