asp.net-mvc-3 – 模拟控制器动作单元测试的默认角色提供程序
发布时间:2020-12-16 03:25:26 所属栏目:asp.Net 来源:网络整理
导读:希望这不是一个愚蠢的问题.我一直在寻找两天来模拟我的行为上的system.web.security.roles的调用. 我希望我的单元测试是隔离的,不需要调用外部资源,例如角色得到存储的数据库. 我发现的所有答案都建议创建一个自定义角色提供者,但我更喜欢模仿假货的创建. 我
希望这不是一个愚蠢的问题.我一直在寻找两天来模拟我的行为上的system.web.security.roles的调用.
我希望我的单元测试是隔离的,不需要调用外部资源,例如角色得到存储的数据库. 我发现的所有答案都建议创建一个自定义角色提供者,但我更喜欢模仿假货的创建. 我得到的最接近的是这个solution,但我没有找到一种方法让ninject在测试之外运行项目时将默认角色Provider传递给构造函数. 我知道Mock类型为此提供了一个更简单的解决方案,但我使用的是犀牛模拟,现在改变太晚了. 解决方法
我和你一样有同样的问题,经过两个小时的搜索,我放弃了.
最后,我最终创建了自己的模拟角色提供程序 – 代码如下. public class MockRoleProvider : RoleProvider { public MockRoleProvider() : base() { Users = new List<User>(); Roles = new List<Role>(); } #region RoleProvider members public override void AddUsersToRoles(string[] usernames,string[] roleNames) { if (usernames == null) throw new ArgumentNullException("usernames"); if (roleNames == null) throw new ArgumentNullException("roleNames"); foreach (string role in roleNames) { if (!RoleExists(role)) throw new ProviderException("Role name does not exist."); } foreach (string user in usernames) { if (Users.FirstOrDefault(u => u.Username == user) == null) throw new ProviderException("Username does not exist."); } foreach (string username in usernames) { User user = Users.FirstOrDefault(u => u.Username == username); if (user == null) continue; foreach (var rolename in roleNames) { Role role = Roles.FirstOrDefault(r => r.RoleName == rolename); user.Roles.Add(role); role.Users.Add(user); } } } public override string ApplicationName { get; set; } public override void CreateRole(string roleName) { if (roleName == null || roleName == "") throw new ProviderException("Role name cannot be empty or null."); if (roleName.Contains(",")) throw new ArgumentException("Role names cannot contain commas."); if (RoleExists(roleName)) throw new ProviderException("Role name already exists."); Roles.Add(new Role { RoleName = roleName }); } public override bool DeleteRole(string roleName,bool throwOnPopulatedRole) { if (roleName == null || roleName == "") throw new ProviderException("Role name cannot be empty or null."); Role role = Roles.FirstOrDefault(r => r.RoleName == roleName); if (role == null) throw new ProviderException("Role name does not exist."); if (throwOnPopulatedRole && GetUsersInRole(roleName).Length > 0) throw new ProviderException("Cannot delete a populated role."); Roles.Remove(Roles.FirstOrDefault(r => r.RoleName == roleName)); return true; } public override string[] FindUsersInRole(string roleName,string usernameToMatch) { return GetUsersInRole(roleName).Where(n => n.Contains(usernameToMatch)).ToArray(); } public override string[] GetAllRoles() { return Roles.Select(r => r.RoleName).ToArray(); } public override string[] GetRolesForUser(string username) { if (username == null || username == "") throw new ProviderException("User name cannot be empty or null."); User user = Users.FirstOrDefault(u => u.Username == username); if (user == null) return new string[0]; return user.Roles.Select(r => r.RoleName).ToArray(); } public override string[] GetUsersInRole(string roleName) { if (roleName == null || roleName == "") throw new ProviderException("Role name cannot be empty or null."); Role role = Roles.FirstOrDefault(r => r.RoleName == roleName); if (role == null) throw new ProviderException("Role '" + roleName + "' does not exist."); return role.Users.Select(u => u.Username).OrderBy(n => n).ToArray(); } public override bool IsUserInRole(string username,string roleName) { if (username == null || username == "") throw new ProviderException("User name cannot be empty or null."); if (roleName == null || roleName == "") throw new ProviderException("Role name cannot be empty or null."); Role role = Roles.FirstOrDefault(r => r.RoleName == roleName); return role != null && role.Users.FirstOrDefault(u => u.Username == username) != null; } public override void RemoveUsersFromRoles(string[] usernames,string[] roleNames) { foreach (string roleName in roleNames) { if (roleName == null || roleName == "") throw new ProviderException("Role name cannot be empty or null."); if (!RoleExists(roleName)) throw new ProviderException("Role name not found."); } foreach (string username in usernames) { if (username == null || username == "") throw new ProviderException("User name cannot be empty or null."); foreach (string roleName in roleNames) { if (!IsUserInRole(username,roleName)) throw new ProviderException("User is not in role."); } } foreach (string username in usernames) { User user = Users.FirstOrDefault(u => u.Username == username); if (user == null) continue; foreach (string roleName in roleNames) { Role role = user.Roles.FirstOrDefault(r => r.RoleName == roleName); role.Users.Remove(user); user.Roles.Remove(role); } } } public override bool RoleExists(string roleName) { if (roleName == null || roleName == "") throw new ProviderException("Role name cannot be empty or null."); return Roles.FirstOrDefault(r => r.RoleName == roleName) != null; } #endregion public void ClearAll() { Users = new List<User>(); Roles = new List<Role>(); } public void ClearRoles() { Roles = new List<Role>(); Users.ForEach(u => u.Roles = new List<Role>()); } public void ClearUsers() { Users = new List<User>(); Roles.ForEach(r => r.Users = new List<User>()); } public void CreateUser(string username) { if (username == null || username == "") throw new ProviderException("User name cannot be empty or null."); if (UserExists(username)) throw new ProviderException("User name already exists."); Users.Add(new User { Username = username }); } public bool DeleteUser(string username) { if (username == null || username == "") throw new ProviderException("User name cannot be empty or null."); User user = Users.FirstOrDefault(u => u.Username == username); if (user == null) throw new ProviderException("User name does not exist."); foreach (Role role in user.Roles) { role.Users.Remove(user); } Users.Remove(user); return true; } public bool UserExists(string username) { if (username == null || username == "") throw new ProviderException("User name cannot be empty or null."); return Users.FirstOrDefault(u => u.Username == username) != null; } private List<Role> Roles { get; set; } private List<User> Users { get; set; } private class Role { public Role() { Users = new List<User>(); } public string RoleName { get; set; } public List<User> Users { get; set; } } private class User { public User() { Roles = new List<Role>(); } public string Username { get; set; } public List<Role> Roles { get; set; } } } 这是RoleProvider的基本但完整的实现. 使用MockRoleProvider为你添加App.config这行XML到< configuration>元件: <system.web> <roleManager enabled="true" defaultProvider="MockRoleProvider"> <providers> <add name="MockRoleProvider" type="YourProject.Tests.MockRoleProvider,YourProject.Tests"/> </providers> </roleManager> </system.web> 然后在单元测试安排部分使用此代码: MockRoleProvider mock = Roles.Provider as MockRoleProvider; if (mock == null) throw new NullReferenceException("MockRoleProvider null exception."); mock.ClearAll(); mock.CreateUser("SomeUser"); mock.CreateRole("SomeRole"); mock.AddUsersToRoles(new string[] { "SomeUser" },new string[] { "SomeRole" }); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net-mvc – OnValidateIdentity会话为空 – Mvc Owin
- Asp.NET Core+ABP框架+IdentityServer4+MySQL+Ext JS之添加
- IE不提供保存ASP.NET表单的密码
- asp.net-mvc – 不同语言的MVC数据注释?
- 为什么我的ASP.Net站点在IIS7下运行需要很长时间才能在一段
- asp.net – 在实现URL路由时阻止对.ASPX页面的正常请求
- ASP.NET MVC:经过几分钟的缓慢访问,然后每次以下请求都快
- ASP.NET Core根据环境切换NLog配置
- 当“必须”我使用asp.net CreateChildControls()?
- 将Instant Messaging集成到ASP.NET应用程序中
推荐文章
站长推荐
- asp.net-mvc – 如何在ASP.NET MVC视图中使用扩展
- sth about abp,zero module,asp.net zero
- SQL Server2005探索之—— 利用SQL Server2005提
- asp.net-mvc-3 – 实体框架4.1代码优先,需要延迟
- asp.net-mvc – 异步操作方法
- asp.net – 如何将网页添加到gridview
- asp.net-mvc – 客户端存储的身份验证令牌在哪里
- asp.net-mvc – 使用UIHint的ASP.NET MVC 3自定义
- asp.net – 最大限度地减少实现可打印报告的痛苦
- asp.net-mvc – 为dnx rc2运行MVC 6 ASP.NET 5本
热点阅读