gpt4 book ai didi

c# - 单元测试,如何设置Thread.CurrentPrincipal和IsAuthenticated

转载 作者:行者123 更新时间:2023-12-02 00:31:06 24 4
gpt4 key购买 nike

我正在尝试对 n 层应用程序、服务层、存储库层和 Web API Controller 执行单元测试。我的存储库正在检查 Thread.CurrentPrincipal 对象以获取当前用户。这就是我遇到问题的地方,当我创建继承自 IPrincipal 的实现类时,它确实允许我设置 IsUserAuthenticated。有没有办法为我的单元测试模拟这个。我想将 Thread.CurrentPrincipal 设置为我的实现对象。我如何以这种方式模拟用户?

在我的 RepositoryBase 代码中,我调用以下代码来确定用户是否经过身份验证:

public bool IsUserAuthenticated
{
get { return ((UserPrincipal)Principal).Identity.IsAuthenticated; }
}

实际测试如下:

Contract.Requires<UserAccessException>(IsUserAuthenticated, "Illegal Access.");

我正在从下面的 UserPrincipal 中提取 IsUserAuthenticated:

namespace HeyLetsTrain.Toolkit.Helper.Authentication
{
public class UserPrincipal : IPrincipal
{
IIdentity _identity;
string[] _role;
string _emailAddress;


public UserPrincipal(string name, string[] role)
{
if (role != null)
{
_role = new string[role.Length];
_role.CopyTo(role, 0);
Array.Sort(_role);
}
_identity = new GenericIdentity(name);
}

public IIdentity Identity
{
get { return _identity; }
}

public string EmailAddress
{
get { return _emailAddress; }
set { this._emailAddress = value; }
}

public bool IsInRole(string role)
{
return Array.BinarySearch(_role, role) >= 0 ? true : false;
}

public bool IsInAllRoles( params string [] roles )
{
foreach (string searchrole in roles )
{
if (Array.BinarySearch(_role, searchrole) < 0 )
return false;
}
return true;
}

public bool IsInAnyRoles( params string [] roles )
{
foreach (string searchrole in roles )
{
if (Array.BinarySearch(_role, searchrole ) > 0 )
return true;
}
return false;
}
}
}

最佳答案

我会用一个类包装 Thread.CurrentPrincipal 调用,然后提取接口(interface)。这种方法允许我将虚拟实现作为依赖项传递。

另一种方法是像这样准备静态类:

public static class ApplicationPrincipal
{
private static Func<IPrincipal> _current = () => Thread.CurrentPrincipal;


public static IPrincipal Current
{
get { return _current(); }
}

public static void SwitchCurrentPrincipal(Func<IPrincipal> principal)
{
_current = principal;
}

}

然后您必须在存储库中使用 ApplicationPrincipal.Current 而不是直接调用。在测试中,您将能够通过调用 ApplicationPrincipal.SwitchCurrentPrincipal(() => myPrincipal) 来切换默认逻辑。

编辑:

我会改变:

public bool IsUserAuthenticated
{
get { return ((UserPrincipal)Principal).Identity.IsAuthenticated; }
}

与:

public bool IsUserAuthenticated
{
get { return ApplicationPrincipal.Current.Identity.IsAuthenticated; }
}

然后在测试的安排部分我将更改默认 IPrincipal:

var principalMock = new UserPrincipal(isAuthenticated: true);

ApplicationPrincipal.SwitchCurrentPrincipal(() => principalMock);

我假设您可以以某种方式重载 UserPrincipal 对象中 IsAuthenticated 的值。

关于c# - 单元测试,如何设置Thread.CurrentPrincipal和IsAuthenticated,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27159622/

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