PageRenderTime 41ms CodeModel.GetById 11ms RepoModel.GetById 0ms app.codeStats 0ms

/Senparc.Weixin.MP.Sample/Senparc.Weixin.MP.Sample.Tests/Mock/MvcMockHelpers.cs

https://github.com/mjhuangzk/WeiXinMPSDK
C# | 147 lines | 118 code | 20 blank | 9 comment | 9 complexity | 948d961bd023dfe0cc09c627cd3e1c91 MD5 | raw file
Possible License(s): BSD-2-Clause, BSD-3-Clause
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.Specialized;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Security.Principal;
  7. using System.Text;
  8. using System.Web;
  9. using System.Web.Mvc;
  10. using System.Web.Routing;
  11. using Moq;
  12. namespace Senparc.Weixin.MP.Sample.Tests.Mock
  13. {
  14. public static class MvcMockHelpers
  15. {
  16. public static HttpContextBase FakeHttpContext(Stream inputStream = null,string userAgent=null)
  17. {
  18. var context = new Mock<HttpContextBase>();
  19. var request = new Mock<HttpRequestBase>();
  20. var response = new Mock<HttpResponseBase>();
  21. var session = new Mock<HttpSessionStateBase>();
  22. var server = new Mock<HttpServerUtilityBase>();
  23. // var requestInputStream = new Mock<Stream>();
  24. //* 如果出现错误:System.ArgumentException: Unable to obtain public key for StrongNameKeyPair
  25. //* 是因为无法对MachineKeys目录进行写和删除操作,
  26. //* 需要给这个文件夹重设权限(Administrators has full control, everyone has had read/write access, but not delete access.):
  27. //* C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA
  28. //* 参考:http://ayende.com/blog/1441/unable-to-obtain-public-key-for-strongnamekeypair
  29. context.Setup(ctx => ctx.Request).Returns(request.Object);
  30. context.Setup(ctx => ctx.Response).Returns(response.Object);
  31. context.Setup(ctx => ctx.Session).Returns(session.Object);
  32. context.Setup(ctx => ctx.Server).Returns(server.Object);
  33. request.Setup(r => r.InputStream).Returns(inputStream);
  34. request.Setup(r => r.UserAgent).Returns(userAgent);
  35. request.Setup(r => r.Url).Returns(new Uri("http://weixin.senparc.com"));
  36. return context.Object;
  37. }
  38. public static HttpContextBase FakeHttpContext(string url, Stream inputStream = null, string userAgent = null)
  39. {
  40. HttpContextBase context = FakeHttpContext(inputStream,userAgent);
  41. context.Request.SetupRequestUrl(url);
  42. return context;
  43. }
  44. public static void SetFakeControllerContext(this Controller controller, Stream inputStream = null, string userAgent = null)
  45. {
  46. var httpContext = FakeHttpContext(inputStream,userAgent);
  47. ControllerContext context = new ControllerContext(new RequestContext(httpContext, new RouteData()), controller);
  48. controller.ControllerContext = context;
  49. }
  50. static string GetUrlFileName(string url)
  51. {
  52. if (url.Contains("?"))
  53. return url.Substring(0, url.IndexOf("?"));
  54. else
  55. return url;
  56. }
  57. static NameValueCollection GetQueryStringParameters(string url)
  58. {
  59. if (url.Contains("?"))
  60. {
  61. NameValueCollection parameters = new NameValueCollection();
  62. string[] parts = url.Split("?".ToCharArray());
  63. string[] keys = parts[1].Split("&".ToCharArray());
  64. foreach (string key in keys)
  65. {
  66. string[] part = key.Split("=".ToCharArray());
  67. parameters.Add(part[0], part[1]);
  68. }
  69. return parameters;
  70. }
  71. else
  72. {
  73. return null;
  74. }
  75. }
  76. public static void SetHttpMethodResult(this HttpRequestBase request, string httpMethod)
  77. {
  78. Mock<HttpRequestBase>.Get(request)
  79. .Setup(req => req.HttpMethod)
  80. .Returns(httpMethod);
  81. }
  82. public static void SetupRequestUrl(this HttpRequestBase request, string url)
  83. {
  84. if (url == null)
  85. throw new ArgumentNullException("url");
  86. if (!url.StartsWith("~/"))
  87. throw new ArgumentException("Sorry, we expect a virtual url starting with \"~/\".");
  88. var mock = Mock<HttpRequestBase>.Get(request);
  89. mock.Setup(req => req.QueryString)
  90. .Returns(GetQueryStringParameters(url));
  91. mock.Setup(req => req.AppRelativeCurrentExecutionFilePath)
  92. .Returns(GetUrlFileName(url));
  93. mock.Setup(req => req.PathInfo)
  94. .Returns(string.Empty);
  95. }
  96. public static IValueProvider SetupFormValueProvider(Dictionary<string, string> formValues)
  97. {
  98. //List<IValueProvider> valueProviders = new List<IValueProvider>();
  99. FormCollection form = new FormCollection();
  100. if (formValues != null)
  101. {
  102. foreach (string key in formValues.Keys)
  103. {
  104. form.Add(key, formValues[key]);
  105. }
  106. }
  107. return form.ToValueProvider();
  108. //valueProviders.Add(form);
  109. //return new ValueProviderCollection(valueProviders);
  110. }
  111. public static IValueProvider SetupFormValueProvider<T>(T obj, string prefix = null) where T : class
  112. {
  113. Dictionary<string, string> formValues = new Dictionary<string, string>();
  114. string valuePrefix = prefix == null ? null : prefix + ".";
  115. try
  116. {
  117. foreach (var prop in obj.GetType().GetProperties())
  118. {
  119. var value = prop.GetValue(obj, null);
  120. formValues[valuePrefix + prop.Name] = value == null ? "" : value.ToString();
  121. }
  122. }
  123. catch { }
  124. return SetupFormValueProvider(formValues);
  125. }
  126. }
  127. }