gpt4 book ai didi

c# - 如何在 MVC 中编写包含 FormsAuthenticationTicket 的单元测试用例

转载 作者:行者123 更新时间:2023-11-30 16:14:50 27 4
gpt4 key购买 nike

在下面的方法中,我正在解密一个 cookie 以返回它,其中包含一个用户名。我尝试为它编写一个测试用例,但返回的 cookie 为空,因为它没有登录。谁能帮我写一个测试用例吗?

public string Username()
{
LoggingManager.Debug("Entering Username - UserManager");
var authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName.ToString(CultureInfo.InvariantCulture)];
if (authCookie != null)
{
FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
if (authTicket != null) return authTicket.Name;
}
const string anonymys = "xyz";
LoggingManager.Debug("Exiting Username - UserManager");
return anonymys;
}

最佳答案

您正在体验对使用静态类的内容进行单元测试的乐趣。您有两个选择:

  1. 将您希望从 HttpContext 中获取的功能包装在一个实现接口(interface)的类中,然后将模拟注入(inject)该类以进行单元测试。

  2. 使用类似于 Fakes framework 的东西创建一个 shim,它将临时创建一个用于单元测试的假 HttpContext

方法#1 的示例:

public interface ICookieProvider
{
HttpCookieCollection GetCookies();
}

public class RealCookieProvider : ICookieProvider
{
public HttpCookieCollection GetCookies()
{
return HttpContext.Current.Request.Cookies;
}
}

然后,通过构造函数将 cookie 提供程序注入(inject)到您的 Controller 中:

private ICookieProvider cookieProvider;
public MyController(ICookieProvider cookieProvider)
{
this.cookieProvider = cookieProvider;
}
public MyController() : this(new RealCookieProvider()) { }

然后您可以使用模拟框架创建一个 ICookieProvider 来返回您想要的任何内容。

请注意,几乎在所有情况下我都更喜欢方法 #1。方法 #2 只是隐藏了问题,即您编写了紧密耦合、难以测试的代码。方法 #1 通过引入松散耦合解决了这个问题。

关于c# - 如何在 MVC 中编写包含 FormsAuthenticationTicket 的单元测试用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20301220/

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