gpt4 book ai didi

c# - 模拟和 HttpContextBase.get_User()

转载 作者:太空狗 更新时间:2023-10-29 23:55:28 25 4
gpt4 key购买 nike

我想模拟 HttpContext 的 User 属性。我正在使用 Scott Hanselman 的 MVCHelper 类和 RhinoMocks。

我有一个包含代码的单元测试,如下所示:

...

MockIdentity fakeId = new MockIdentity("TEST_USER", "Windows", true);
MockPrincipal fakeUser = new MockPrincipal(null, fakeId);

using (mocks.Record())
{
Expect.Call(fakeHttpContext.User).Return(fakeUser);
}

...

我的 MockIdentity 和 MockPrincipal 类分别是符合 IIdentity 和 IPrincipal 的模拟。

我在运行报告的单元测试时遇到错误:

System.NotImplementedException : The method or operation is not implemented. at System.Web.HttpContextBase.get_User()

当我尝试为 User 属性设置期望值时会发生这种情况。

我知道 httpContextBase 有一个未实现的 getter 和 setter,但我认为 Rhino 会在模拟时处理这个问题。

这是否意味着我必须从 HttpContextbase 派生并覆盖我的模拟对象的属性。看起来很奇怪。

其他用户遇到过这个问题,并在此处报告: http://www.mail-archive.com/rhinomocks@googlegroups.com/msg00546.html

最佳答案

我遇到了几乎相同的问题并转到了最小起订量。

这是我在我的应用程序中使用的自定义助手:

public static class MvcMockHelpers
{
public static HttpContextBase FakeHttpContext()
{

var context = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>();
var response = new Mock<HttpResponseBase>();
var session = new Mock<HttpSessionStateBase>();
var server = new Mock<HttpServerUtilityBase>();

context.Expect(ctx => ctx.Request).Returns(request.Object);
context.Expect(ctx => ctx.Response).Returns(response.Object);
context.Expect(ctx => ctx.Session).Returns(session.Object);
context.Expect(ctx => ctx.Server).Returns(server.Object);


var form = new NameValueCollection();
var querystring = new NameValueCollection();
var cookies = new HttpCookieCollection();
var user = new GenericPrincipal(new GenericIdentity("testuser"), new string[] { "Administrator" });

request.Expect(r => r.Cookies).Returns(cookies);
request.Expect(r => r.Form).Returns(form);
request.Expect(q => q.QueryString).Returns(querystring);

response.Expect(r => r.Cookies).Returns(cookies);

context.Expect(u => u.User).Returns(user);



return context.Object;
}

public static HttpContextBase FakeHttpContext(string url)
{
HttpContextBase context = FakeHttpContext();
context.Request.SetupRequestUrl(url);

return context;

}


public static void SetFakeControllerContext(this Controller controller)
{
var httpContext = FakeHttpContext();
ControllerContext context = new ControllerContext(new RequestContext(httpContext, new RouteData()), controller);
controller.ControllerContext = context;
}

public static void SetFakeControllerContext(this Controller controller, RouteData routeData)
{
SetFakeControllerContext(controller, new Dictionary<string, string>(), new HttpCookieCollection(), routeData);
}

public static void SetFakeControllerContext(this Controller controller, HttpCookieCollection requestCookies)
{
SetFakeControllerContext(controller,new Dictionary<string,string>(),requestCookies, new RouteData());
}

public static void SetFakeControllerContext(this Controller controller, Dictionary<string, string> formValues)
{
SetFakeControllerContext(controller, formValues, new HttpCookieCollection(), new RouteData());
}

public static void SetFakeControllerContext(this Controller controller,
Dictionary<string, string> formValues,
HttpCookieCollection requestCookies,
RouteData routeData)
{
var httpContext = FakeHttpContext();

foreach (string key in formValues.Keys)
{
httpContext.Request.Form.Add(key, formValues[key]);

}
foreach (string key in requestCookies.Keys)
{
httpContext.Request.Cookies.Add(requestCookies[key]);

}
ControllerContext context = new ControllerContext(new RequestContext(httpContext, routeData), controller);
controller.ControllerContext = context;
}

public static void SetFakeControllerContextWithLogin(this Controller controller, string userName,
string password,
string returnUrl)
{

var httpContext = FakeHttpContext();


httpContext.Request.Form.Add("username", userName);
httpContext.Request.Form.Add("password", password);
httpContext.Request.QueryString.Add("ReturnUrl", returnUrl);

ControllerContext context = new ControllerContext(new RequestContext(httpContext, new RouteData()), controller);
controller.ControllerContext = context;
}


static string GetUrlFileName(string url)
{
if (url.Contains("?"))
return url.Substring(0, url.IndexOf("?"));
else
return url;
}

static NameValueCollection GetQueryStringParameters(string url)
{
if (url.Contains("?"))
{
NameValueCollection parameters = new NameValueCollection();

string[] parts = url.Split("?".ToCharArray());
string[] keys = parts[1].Split("&".ToCharArray());

foreach (string key in keys)
{
string[] part = key.Split("=".ToCharArray());
parameters.Add(part[0], part[1]);
}

return parameters;
}
else
{
return null;
}
}

public static void SetHttpMethodResult(this HttpRequestBase request, string httpMethod)
{
Mock.Get(request)
.Expect(req => req.HttpMethod)
.Returns(httpMethod);
}

public static void SetupRequestUrl(this HttpRequestBase request, string url)
{
if (url == null)
throw new ArgumentNullException("url");

if (!url.StartsWith("~/"))
throw new ArgumentException("Sorry, we expect a virtual url starting with \"~/\".");

var mock = Mock.Get(request);

mock.Expect(req => req.QueryString)
.Returns(GetQueryStringParameters(url));
mock.Expect(req => req.AppRelativeCurrentExecutionFilePath)
.Returns(GetUrlFileName(url));
mock.Expect(req => req.PathInfo)
.Returns(string.Empty);
}

关于c# - 模拟和 HttpContextBase.get_User(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/677801/

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