PageRenderTime 58ms CodeModel.GetById 32ms RepoModel.GetById 0ms app.codeStats 0ms

/Senparc.Weixin.MP/Senparc.Weixin.MP.Test/MessageHandlers/MessageHandlersTest.cs

https://github.com/mjhuangzk/WeiXinMPSDK
C# | 220 lines | 184 code | 29 blank | 7 comment | 4 complexity | cdf777931a422fffac2b15402b34e5fe MD5 | raw file
Possible License(s): BSD-2-Clause, BSD-3-Clause
  1. using System;
  2. using System.Linq;
  3. using System.Collections.Generic;
  4. using System.Threading;
  5. using System.Xml.Linq;
  6. using Microsoft.VisualStudio.TestTools.UnitTesting;
  7. using Senparc.Weixin.MP.Context;
  8. using Senparc.Weixin.MP.Entities;
  9. using Senparc.Weixin.MP.MessageHandlers;
  10. namespace Senparc.Weixin.MP.Test.MessageHandlers
  11. {
  12. public class CustomerMessageHandlers : MessageHandler<MessageContext>
  13. {
  14. public CustomerMessageHandlers(XDocument requestDoc)
  15. : base(requestDoc)
  16. {
  17. }
  18. public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
  19. {
  20. var responseMessage =
  21. ResponseMessageBase.CreateFromRequestMessage(RequestMessage, ResponseMsgType.Text) as
  22. ResponseMessageText;
  23. responseMessage.Content = "文字信息";
  24. return responseMessage;
  25. }
  26. public override IResponseMessageBase OnLocationRequest(RequestMessageLocation requestMessage)
  27. {
  28. throw new NotImplementedException();
  29. }
  30. public override IResponseMessageBase OnImageRequest(RequestMessageImage requestMessage)
  31. {
  32. throw new NotImplementedException();
  33. }
  34. public override IResponseMessageBase OnVoiceRequest(RequestMessageVoice requestMessage)
  35. {
  36. throw new NotImplementedException();
  37. }
  38. public override IResponseMessageBase OnEvent_EnterRequest(RequestMessageEvent_Enter requestMessage)
  39. {
  40. throw new NotImplementedException();
  41. }
  42. public override IResponseMessageBase OnEvent_LocationRequest(RequestMessageEvent_Location requestMessage)
  43. {
  44. throw new NotImplementedException();
  45. }
  46. public override IResponseMessageBase OnEvent_SubscribeRequest(RequestMessageEvent_Subscribe requestMessage)
  47. {
  48. throw new NotImplementedException();
  49. }
  50. public override IResponseMessageBase OnEvent_UnsubscribeRequest(RequestMessageEvent_Unsubscribe requestMessage)
  51. {
  52. throw new NotImplementedException();
  53. }
  54. public override IResponseMessageBase OnEvent_ClickRequest(RequestMessageEvent_Click requestMessage)
  55. {
  56. throw new NotImplementedException();
  57. }
  58. public override IResponseMessageBase OnLinkRequest(RequestMessageLink requestMessage)
  59. {
  60. throw new NotImplementedException();
  61. }
  62. }
  63. [TestClass]
  64. public class MessageHandlersTest
  65. {
  66. string xmlText = @"<?xml version=""1.0"" encoding=""utf-8""?>
  67. <xml>
  68. <ToUserName><![CDATA[gh_a96a4a619366]]></ToUserName>
  69. <FromUserName><![CDATA[olPjZjsXuQPJoV0HlruZkNzKc91E]]></FromUserName>
  70. <CreateTime>1357986928</CreateTime>
  71. <MsgType><![CDATA[text]]></MsgType>
  72. <Content><![CDATA[TNT2]]></Content>
  73. <MsgId>5832509444155992350</MsgId>
  74. </xml>
  75. ";
  76. [TestMethod]
  77. public void TextMessageRequestTest()
  78. {
  79. var messageHandlers = new CustomerMessageHandlers(XDocument.Parse(xmlText));
  80. Assert.IsNotNull(messageHandlers.RequestDocument);
  81. messageHandlers.Execute();
  82. Assert.IsNotNull(messageHandlers.ResponseMessage);
  83. Assert.IsNotNull(messageHandlers.ResponseDocument);
  84. Console.Write(messageHandlers.ResponseDocument.ToString());
  85. Assert.AreEqual("gh_a96a4a619366", messageHandlers.ResponseMessage.FromUserName);
  86. var responseMessage = messageHandlers.ResponseMessage as ResponseMessageText;
  87. Assert.IsNotNull(responseMessage);
  88. Assert.AreEqual("文字信息", responseMessage.Content);
  89. }
  90. [TestMethod]
  91. public void SyncTest()
  92. {
  93. //测试缓存同步
  94. var messageHandlers1 = new CustomerMessageHandlers(XDocument.Parse(xmlText));
  95. var messageHandlers2 = new CustomerMessageHandlers(XDocument.Parse(xmlText));
  96. messageHandlers1.Execute();
  97. Assert.AreEqual(messageHandlers1.WeixinContext.GetHashCode(), messageHandlers2.WeixinContext.GetHashCode());
  98. }
  99. [TestMethod]
  100. public void ContextTest()
  101. {
  102. var messageHandlers = new CustomerMessageHandlers(XDocument.Parse(xmlText));
  103. messageHandlers.Execute();
  104. var messageContext = messageHandlers.WeixinContext.GetMessageContext(messageHandlers.RequestMessage);
  105. Assert.IsTrue(messageContext.RequestMessages.Count > 0);
  106. Assert.IsNotNull(messageHandlers.CurrentMessageContext);
  107. Assert.AreEqual("olPjZjsXuQPJoV0HlruZkNzKc91E", messageHandlers.CurrentMessageContext.UserName);
  108. messageHandlers.WeixinContext.ExpireMinutes = 0;//马上过期
  109. messageHandlers.Execute();
  110. messageContext = messageHandlers.WeixinContext.GetMessageContext(messageHandlers.RequestMessage);
  111. Assert.AreEqual(0, messageContext.RequestMessages.Count);
  112. }
  113. private class TestContext
  114. {
  115. public static int FinishCount = 0;
  116. public static string RequestXmlFormat = @"<?xml version=""1.0"" encoding=""utf-8""?>
  117. <xml>
  118. <ToUserName><![CDATA[gh_a96a4a619366]]></ToUserName>
  119. <FromUserName><![CDATA[{0}]]></FromUserName>
  120. <CreateTime>1357986928</CreateTime>
  121. <MsgType><![CDATA[text]]></MsgType>
  122. <Content><![CDATA[TNT2]]></Content>
  123. <MsgId>5832509444155992350</MsgId>
  124. </xml>
  125. ";
  126. public void Run()
  127. {
  128. for (int i = 0; i < 10; i++)
  129. {
  130. //模拟10个不同用户名
  131. var userName = Thread.CurrentThread.Name + "_" + i;
  132. var xml = string.Format(RequestXmlFormat, userName);
  133. for (int j = 0; j < 2; j++)
  134. {
  135. //每个用户请求2次
  136. var messageHandlers = new CustomerMessageHandlers(XDocument.Parse(xml));
  137. messageHandlers.Execute();
  138. }
  139. Thread.Sleep(5);
  140. }
  141. TestContext.FinishCount++;
  142. }
  143. }
  144. [TestMethod]
  145. public void RestoreTest()
  146. {
  147. var messageHandlers = new CustomerMessageHandlers(XDocument.Parse(xmlText));
  148. messageHandlers.Execute();
  149. Assert.IsTrue(messageHandlers.WeixinContext.MessageCollection.Count > 0);
  150. messageHandlers.WeixinContext.Restore();
  151. Assert.AreEqual(0, messageHandlers.WeixinContext.MessageCollection.Count);
  152. }
  153. [TestMethod]
  154. public void MutipleThreadsTest()
  155. {
  156. //
  157. var weixinContext = MessageHandler<MessageContext>.GlobalWeixinContext;//全局共享的WeixinContext上下文对象
  158. weixinContext.Restore();
  159. //多线程并发写入测试
  160. List<Thread> threadList = new List<Thread>();
  161. for (int i = 0; i < 200; i++)
  162. {
  163. var testContext = new TestContext();
  164. var thread = new Thread(testContext.Run);
  165. thread.Name = i.ToString();
  166. threadList.Add(thread);
  167. }
  168. threadList.ForEach(z => z.Start()); //开始所有线程
  169. while (TestContext.FinishCount < 200)
  170. {
  171. }
  172. Assert.AreEqual(200 * 10, weixinContext.MessageCollection.Count); //用户数量
  173. //判断消息上下是否自动移到底部
  174. {
  175. var userName = "3_4";
  176. var xml = string.Format(TestContext.RequestXmlFormat, userName);
  177. var messageHandlers = new CustomerMessageHandlers(XDocument.Parse(xml));
  178. messageHandlers.Execute();
  179. var lastQueueMessage = weixinContext.MessageQueue.Last();
  180. Assert.AreEqual(userName, lastQueueMessage.UserName);
  181. }
  182. //判断超时信息是否被及时删除
  183. {
  184. weixinContext.ExpireMinutes = 0.001; //设置过期时间(0.06秒)
  185. Thread.Sleep(100);
  186. weixinContext.GetLastRequestMessage("new"); //触发过期判断
  187. Assert.AreEqual(1, weixinContext.MessageCollection.Count); //只删除剩下当前这一个
  188. }
  189. }
  190. }
  191. }