gpt4 book ai didi

c# - 如何模拟自定义 UserStore 和 RoleStore

转载 作者:太空宇宙 更新时间:2023-11-03 12:59:59 26 4
gpt4 key购买 nike

我将 ASP.Identity 与自定义 UserStore 和 RoleStore 结合使用。
这是我的数据库上下文:

public class AppDbContext 
: IdentityDbContext<User, Role, int, UserLogin, UserRole, UserClaim>

我的 Seed 方法中有以下代码来添加用户:

// UserManager
var userStore = new UserStore<User, Role, int, UserLogin, UserRole, UserClaim>(context)
var userManager = new UserManager<User, int>(userStore);

// RoleManager
var roleStore = new RoleStore<Role, int, UserRole>(context)
var roleManager = new RoleManager<Role, int>(roleStore);

// Create Roles
roleManager.Create(new Role(roleName));
...

// Create Users
var user = new User { ... };
var result = userManager.Create(user, password);
...

// Add Users to Roles
userManager.AddToRole(user.Id, roleName);
...

如何在我的 Mock 框架单元测试中做到这一点?

我需要为以下方法编写单元测试:

public IEnumerable<User> GetUsersInRole(string roleName)
{
return (from u in this.DbContext.Users
from ur in u.Roles
join r in this.DbContext.Roles on ur.RoleId equals r.Id
where r.Name == roleName
select u).Distinct();
}

这是我的测试方法:

this.Bind<Mock<AppDbContext>>()
.ToMethod(
m =>
NunitTestHelper.GetDbContextMock()
//.SetupDbContextData(x => x.Roles, this.RolesCollection.AsQueryable())
//.SetupDbContextData(x => x.Users, this.UsersCollection.AsQueryable())
).InTransientScope();

var context = this.Kernel.Get<AppDbContext>();

var userStore = new Mock<UserStore<User, Role, int, UserLogin, UserRole, UserClaim>>(context);
var userManager = new UserManager<User, int>(userStore.Object);

var roleStore = new Mock<RoleStore<Role, int, UserRole>>(context);
var roleManager = new RoleManager<Role, int>(roleStore.Object);

roleManager.Create(new Role(roleName));

for (var i = 0; i < num; i++)
{
var id = i + 1;
var user = new User { Id = id, UserName = "User" + i };
var result = userManager.Create(user);
userManager.AddToRole(id, roleName); // Exception
}

在线“userManager.AddToRole”我得到以下异常:

“找不到用户 ID。”

如何在单元测试中将用户添加到角色?
我没有直接访问 UserRoles 实体的权限。

最佳答案

我曾尝试使用不同的框架和方法多次模拟 DbContext。而且我从来没有得到一个可靠的模拟对象,它在各种情况下都表现得像真实的一样。

或者当我可以模拟 DbContext 时,设置代码如此庞大且难以设置,这是不值得的。此外,该设置非常脆弱,并且在实际代码的每一次更改时都会崩溃。

测试与数据库相关的代码的最佳方法是转到实际数据库。这样的测试不再是单元测试,而是成为集成测试。但这是一个术语 - 您仍在测试您的代码(和数据库结构)。

不幸的是,设置可靠运行的数据库测试需要花费更多的精力。但是如果你想研究这个,这里有一些引用资料:

关于c# - 如何模拟自定义 UserStore 和 RoleStore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32609789/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com