How do I mock/fake the session object in ASP.Net Web forms?(如何模拟/伪造 ASP.Net Web 表单中的会话对象?)
问题描述
在创建单元测试时,有没有办法在 ASP.Net Web 表单中模拟/伪造会话对象?
Is there a way to mock/fake the session object in ASP.Net Web forms when creating unit tests?
我目前将用户详细信息存储在我的业务逻辑可以访问的会话变量中.
I am currently storing user details in a session variable which is accessed by my business logic.
单独测试我的业务逻辑时,会话不可用.这似乎表明设计不好(尽管我不确定).业务逻辑层应该首先访问会话变量吗?
When testing my business logic in isolation, the session is not available. This seems to indicate a bad design (though I'm not sure). Should the business logic layer be accessing session variables in the first place?
如果是这样,那么我将如何将用户详细信息与假对象交换以进行测试?
If so, then how would I go about swapping the user details with a fake object for testing?
推荐答案
在 ASP.NET 中,不能创建 HttpSessionState 的 Test Double,因为它是 sealed
.是的,对于 ASP.NET 的原始设计者来说,这是一个糟糕的设计,但没有什么可做的.
In ASP.NET, you can't create a Test Double of HttpSessionState because it is sealed
. Yes, this is bad design on the part of the original designers of ASP.NET, but there's not a lot to do about it.
这是 TDD 和其他 SOLID 实践者在很大程度上放弃 ASP.NET 转而支持 ASP.NET MVC 和其他更可测试的框架的众多原因之一.在 ASP.NET MVC 中,HTTP 会话由抽象的 HttpSessionStateBase 类建模.
This is one of many reasons why TDD'ers and other SOLID practictioners have largely abandonded ASP.NET in favor of ASP.NET MVC and other, more testable frameworks. In ASP.NET MVC, the HTTP session is modelled by the abstract HttpSessionStateBase class.
您可以采用类似的方法,让您的对象在一个抽象会话上工作,然后当您在 ASP.NET 环境中运行时包装真正的 HttpSessionState 类.根据具体情况,您甚至可以重用 System.Web.Abstractions 中的类型,但如果不能,您可以定义自己的类型.
You could take a similar approach and let your objects work on an abstract session, and then wrap the real HttpSessionState class when you are running in the ASP.NET environment. Depending on circumstances, you may even be able to reuse the types from System.Web.Abstractions, but if not, you can define your own.
无论如何,您的业务逻辑就是您的域模型,它应该独立于任何特定的运行时技术进行建模,所以我想说它不应该访问会话对象第一名.
In any case, your business logic is your Domain Model and it should be modeled independently of any particular run-time technology, so I would say that it shouldn't be accessing the session object in the first place.
如果您绝对需要对涉及 HttpSessionState 的单元 tets 使用测试替身,这仍然可以使用某些侵入性动态模拟,例如 TypeMock 或 鼹鼠,虽然这些带有很多缺点也是(见 动态模拟的比较).
If you absolutely need to use Test Doubles for unit tets involving HttpSessionState, this is still possible with certain invasive dynamic mocks, such as TypeMock or Moles, althought these carry plenty of disadvantages as well (see this comparison of dynamic mocks).
这篇关于如何模拟/伪造 ASP.Net Web 表单中的会话对象?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何模拟/伪造 ASP.Net Web 表单中的会话对象?


- 如何用自己压缩一个 IEnumerable 2022-01-01
- 良好实践:如何重用 .csproj 和 .sln 文件来为 CI 创建 2022-01-01
- WebMatrix WebSecurity PasswordSalt 2022-01-01
- 带有服务/守护程序应用程序的 Microsoft Graph CSharp SDK 和 OneDrive for Business - 配额方面返回 null 2022-01-01
- C#MongoDB使用Builders查找派生对象 2022-09-04
- 输入按键事件处理程序 2022-01-01
- 在哪里可以找到使用中的C#/XML文档注释的好例子? 2022-01-01
- MoreLinq maxBy vs LINQ max + where 2022-01-01
- C# 中多线程网络服务器的模式 2022-01-01
- Web Api 中的 Swagger .netcore 3.1,使用 swagger UI 设置日期时间格式 2022-01-01