在ASP.net中模拟HttpSessionState进行单元测试
发布时间:2020-12-15 22:23:01 所属栏目:asp.Net 来源:网络整理
导读:我已经看到很多关于HttpSessionState和asp.net MVC的讨论. 我试图为asp.net应用程序编写测试,并想知道是否可以模拟HttpSessionState,如果是,怎么办? 我目前正在使用犀牛模型和Nunit 解决方法 吉尔伯特 也许我为你太迟了我使用MSpec,但我认为这些概念是相似
我已经看到很多关于HttpSessionState和asp.net MVC的讨论.
我试图为asp.net应用程序编写测试,并想知道是否可以模拟HttpSessionState,如果是,怎么办? 我目前正在使用犀牛模型和Nunit 解决方法
吉尔伯特
也许我为你太迟了我使用MSpec,但我认为这些概念是相似的.我需要在被测控制器中模拟HttpContext的几个组件. 我开始使用以下类来模拟HttpContextBase中必要的(为了我的目的)组件.我只是把班里的必要的东西翻过来.您的需求将随控制器中所需的模拟而变化.一旦了解了模式,就可以根据需要添加嘲讽. public class MockHttpContext : HttpContextBase { private readonly HttpRequestBase _request = new MockHttpRequest(); private readonly HttpServerUtilityBase _server = new MockHttpServerUtilityBase(); private HttpSessionStateBase _session = new MockHttpSession(); public override HttpRequestBase Request { get { return _request; } } public override HttpServerUtilityBase Server { get { return _server; } } public override HttpSessionStateBase Session { get { return _session; } } } public class MockHttpRequest : HttpRequestBase { private Uri _url = new Uri("http://www.mockrequest.moc/Controller/Action"); public override Uri Url { get { return _url; } } } public class MockHttpServerUtilityBase : HttpServerUtilityBase { public override string UrlEncode(string s) { //return base.UrlEncode(s); return s; // Not doing anything (this is just a Mock) } } public class MockHttpSession : HttpSessionStateBase { // Started with sample https://stackoverflow.com/questions/524457/how-do-you-mock-the-session-object-collection-using-moq // from https://stackoverflow.com/users/81730/ronnblack System.Collections.Generic.Dictionary<string,object> _sessionStorage = new System.Collections.Generic.Dictionary<string,object>(); public override object this[string name] { get { return _sessionStorage[name]; } set { _sessionStorage[name] = value; } } public override void Add(string name,object value) { _sessionStorage[name] = value; } } 这是我如何设置Controller Context以使用mocks(MSpec).这是为了对实际测试进行设置(测试来源于此类) public abstract class BlahBlahControllerContext { protected static BlahBlahController controller; Establish context = () => { controller = new BlahBlahController(); controller.ControllerContext = new ControllerContext() { Controller = controller,RequestContext = new RequestContext(new MockHttpContext(),new RouteData()),}; }; } 进一步说明这里是使用模拟会话的测试(MSpec世界的规范): [Subject("ACCOUNT: Retrieve Password")] public class retrieve_password_displays_retrieve_password2_page_on_success : BlahBlahControllerContext { static ActionResult result; static RetrievePasswordModel model; Establish context = () => { model = new RetrievePasswordModel() { UserName = "Mike" }; }; Because of = () => { result = controller.RetrievePassword(model); }; It should_return_a_RedirectToRouteResult = () => { result.is_a_redirect_to_route_and().action_name().ShouldEqual("RetrievePassword2"); }; It session_should_contain_UN_value = () => { controller.HttpContext.Session["UN"].ShouldEqual("Mike"); }; It session_should_contain_PQ_value = () => { controller.HttpContext.Session["PQ"].ShouldEqual("Question"); }; } 我意识到这不使用犀牛模型.我希望它能够说明原则,读者可以将其用于具体的工具和方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net-mvc – 在MVC API中接受字节数组参数作为Base64
- 单声道是asp.net的可行替代方案吗?
- asp.net-mvc – 更新我的模型然后重新评估IsValid?
- asp.net-mvc-2 – ASP.NET MVC 2多个PartialView Forms字段
- asp.net-mvc – AntiForgeryToken登录后无效
- asp.net-mvc – 控制器或模型中的存储库?
- asp.net – 为什么我的SiteMapPath在Firefox中有“Skip Nav
- 提交前台table中的值到后台的几种方式
- asp.net – Visual Studio开发服务器使用错误的端口
- asp.net-mvc-3 – 找不到概念模型类型