![]() |
1
41
众所周知,WebForms不稳定的原因正是如此——许多代码可以依赖ASP.NET管道中的静态类。
为了用moq测试这一点,您需要重构
更好的是,您可以模拟httpContextBase并使用moq设置您对它的期望。包括登录用户等。
有了这个,你可以打电话
|
![]() |
2
3
通常,对于ASP.NET单元测试,而不是访问httpcontext.current,您应该有一个httpcontextbase类型的属性,该属性的值由依赖项注入设置(例如在womp提供的答案中)。 但是,对于测试与安全相关的函数,我建议使用thread.currenthread.principal(而不是httpcontext.current.user)。使用thread.currentThread还具有可在Web上下文外部重用的优点(并且在Web上下文中工作相同,因为ASP.NET框架始终将两个值设置为相同的值)。 为了测试thread.currenthread.principal,我通常使用一个作用域类,该类将thread.currenthread设置为测试值,然后在释放时重置:
这很适合标准的.NET安全组件——其中一个组件有一个已知的接口(iprincipal)和位置(thread.currenthread.principal)——并且可以使用任何正确使用/检查thread.currenthread.principal的代码。 基本作用域类如下所示(根据需要调整以添加角色):
另一种选择是,编写应用程序以使用注入的安全详细信息,而不是使用标准的安全组件位置,例如,使用getcurrentUser()方法或类似方法添加ISecurityContext属性,然后在整个应用程序中一致地使用该属性——但如果要在Web应用程序的上下文中执行此操作,则Y您还可以使用预构建的注入上下文httpContextBase。 |
![]() |
3
1
使用httpSimulator类,您可以将httpContext传递给处理程序
httpSimulator实现了获取httpContext实例所需的功能。所以你不需要在这里使用MOQ。 |
![]() |
4
1
你也可以像下面那样吸烟
|
![]() |
5
0
如果您使用的是clr安全模型(和我们一样),那么如果您想允许测试,就需要使用一些抽象的函数来获取和设置当前主体,并在获取或设置主体时使用这些函数。这样做允许您在任何相关的地方获取/设置主体(通常在
如果您使用自定义主体,那么这些主体可以非常好地集成到它的接口中,例如下面
|
![]() |
6
0
在使用moq进行单元测试时,这与您所需要的并不真正相关。 一般来说,我们在工作中有一个分层的体系结构,其中表示层上的代码实际上只是用来安排在UI上显示的内容。这种代码不包含在单元测试中。其余的逻辑都驻留在业务层上,不必依赖于表示层(即特定于用户界面的引用,如httpContext),因为用户界面也可能是WinForms应用程序,而不一定是Web应用程序。 通过这种方式,您可以避免与模拟框架混淆,尝试模拟httprequest等……尽管通常它仍然是必要的。 |
![]() |
Developer · 使用MOQ嵌套类和接口C的单元测试# 7 年前 |
![]() |
Graeme · 看看有什么传给了一个Mock? 7 年前 |
![]() |
erexo · Moq模拟。Of<Obj>vs new Obj(); 7 年前 |
![]() |
Dede · Moq方法调用序列比较 7 年前 |
![]() |
filur · 管理复杂单元测试模拟数据 7 年前 |