-
Notifications
You must be signed in to change notification settings - Fork 1
/
MvcMockHelper.cs
113 lines (94 loc) · 3.89 KB
/
MvcMockHelper.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using Microsoft.Owin;
using Moq;
namespace Helpers
{
public class MvcMockHelper
{
public Mock<HttpContextBase> HttpContext { get; private set; }
public Mock<HttpRequestBase> Request { get; private set; }
public Mock<HttpResponseBase> Response { get; private set; }
public Mock<HttpSessionStateBase> Session { get; private set; }
public Mock<HttpServerUtilityBase> Server { get; private set; }
public OwinContext OwinContext { get; private set; }
public MvcMockHelper()
{
HttpContext = new Mock<HttpContextBase>();
Request = new Mock<HttpRequestBase>();
Response = new Mock<HttpResponseBase>();
Session = new Mock<HttpSessionStateBase>();
Server = new Mock<HttpServerUtilityBase>();
HttpContext.Setup(ctx => ctx.Request).Returns(Request.Object);
HttpContext.Setup(ctx => ctx.Request.Url).Returns(new Uri("http://TestUrl/"));
HttpContext.Setup(ctx => ctx.Response).Returns(Response.Object);
HttpContext.Setup(ctx => ctx.Session).Returns(Session.Object);
HttpContext.SetupGet(x => x.Response.Cookies).Returns(new HttpCookieCollection());
HttpContext.Setup(ctx => ctx.Server).Returns(Server.Object);
HttpContext.Setup(ctx => ctx.Items).Returns(new Dictionary<string, object>());
}
public MvcMockHelper For(Controller controller)
{
ControllerContext context = new ControllerContext(new RequestContext(HttpContext.Object, new RouteData()), controller);
controller.ControllerContext = context;
var urlHelper = new Mock<UrlHelper>();
urlHelper.Setup(x => x.Action(It.IsAny<string>(), It.IsAny<string>(), null, It.IsAny<string>())).Returns("");
controller.Url = urlHelper.Object;
OwinContext = new OwinContext();
controller.HttpContext.Items["owin.Environment"] = OwinContext.Environment;
return this;
}
public MvcMockHelper SetHttpMethodResult(string httpMethod)
{
Request
.Setup(req => req.HttpMethod)
.Returns(httpMethod);
return this;
}
public MvcMockHelper SetupRequestUrl(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 = Request;
mock.Setup(req => req.QueryString)
.Returns(GetQueryStringParameters(url));
mock.Setup(req => req.AppRelativeCurrentExecutionFilePath)
.Returns(GetUrlFileName(url));
mock.Setup(req => req.PathInfo)
.Returns(string.Empty);
return this;
}
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;
}
}
}
}