Moq:对依赖 HttpContext 的方法进行单元测试

2024-07-01

考虑 .NET 程序集中的一个方法:

public static string GetSecurityContextUserName()
{             
 //extract the username from request              
 string sUser = HttpContext.Current.User.Identity.Name;
 //everything after the domain     
 sUser = sUser.Substring(sUser.IndexOf("\\") + 1).ToLower();

 return sUser;      
}

我想使用 Moq 框架从单元测试中调用此方法。该程序集是 Webforms 解决方案的一部分。单元测试看起来像这样,但我缺少起订量代码。

//arrange 
 string ADAccount = "BUGSBUNNY";
 string fullADName = "LOONEYTUNES\BUGSBUNNY"; 

 //act    
 //need to mock up the HttpContext here somehow -- using Moq.
 string foundUserName = MyIdentityBL.GetSecurityContextUserName();

 //assert
 Assert.AreEqual(foundUserName, ADAccount, true, "Should have been the same User Identity.");

Question:

  • 如何使用 Moq 来安排具有“MyDomain\MyUser”等值的假 HttpContext 对象?
  • 我如何将该假与我对静态方法的调用关联起来MyIdentityBL.GetSecurityContextUserName()?
  • 您对如何改进此代码/架构有什么建议吗?

由于这个确切原因,Webforms 是出了名的不可测试 - 许多代码可以依赖于 ASP.NET 管道中的静态类。

为了使用 Moq 进行测试,您需要重构您的GetSecurityContextUserName()使用依赖注入的方法HttpContextBase object.

HttpContextWrapper驻留在System.Web.Abstractions,随 .Net 3.5 一起提供。它是一个包装器HttpContext类,并扩展HttpContextBase,你可以构建一个HttpContextWrapper像这样:

var wrapper = new HttpContextWrapper(HttpContext.Current);

更好的是,您可以模拟 HttpContextBase 并使用 Moq 设置您对它的期望。包括登录的用户等。

var mockContext = new Mock<HttpContextBase>();

完成此操作后,您可以调用GetSecurityContextUserName(mockContext.Object),并且您的应用程序与静态 WebForms HttpContext 的耦合要少得多。如果您要进行大量依赖于模拟上下文的测试,我强烈建议看一下 Scott Hanselman 的 MvcMockHelpers 类 http://www.hanselman.com/blog/ASPNETMVCSessionAtMix08TDDAndMvcMockHelpers.aspx,它有一个与 Moq 一起使用的版本。它可以方便地处理许多必要的设置。尽管有这个名称,但您不需要使用 MVC 来完成它 - 当我可以重构它们以使用时,我成功地将它与 Webforms 应用程序一起使用HttpContextBase.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Moq:对依赖 HttpContext 的方法进行单元测试 的相关文章

  • 如何使用OpenCV的归一化相关性?

    如何使用 OpenCV 的归一化相关性 有人可以提供代码示例吗 我的问题 我有一个螺丝头图像 需要找到螺丝的中心 所以我正在考虑使用 OpenCV 相关性 这是一个好主意吗 您可以在下面的链接下找到示例图像 http imageshack
  • 在 OpenCV C++ 中使用 gpu::GpuMat

    我想知道如何修改gpu GpuMat 事实上我想知道是否可以使用gpu GpuMat like a cv Mat 我想做这样的事情 cv namedWindow Result cv Mat src host cv imread lena j
  • 有效取消引用空指针的规则是什么?

    include
  • UWP 导航 (Template10)、枢轴控制、多帧

    我正在尝试在我的 UWP 应用程序中实现以下导航样式 使用 Template10 但正在努力如何使用多个帧作为独立的历史堆栈 在枢轴的每个框架内 我希望有一个独立的框架 它有自己的历史记录和后堆栈 只能通过枢轴在框架之间导航 我正在考虑使用
  • “constexpr”有什么用?

    我实在是找不到它有什么用处 我的第一个想法是我可以用它来实现 按合同设计 而不使用如下宏 struct S S constexpr int i S i static assert i lt 9 i must be lt 9 S int i
  • elmah定制提供商及暴露事件

    我想知道如何创建自定义提供程序来存储错误日志 例如 Windows 事件查看器的提供者 如果到目前为止不可能 我还想知道是否有任何可以覆盖的公开事件 以便我可以注入我的代码 获取异常 做任何我想做的事情 我知道 Global asax 中有
  • 启动离线 ClickOnce 应用程序并等待退出

    我已经部署了 ClickOnce Windows 窗体应用程序 应用程序 A 另一个应用程序 应用程序 B 以文件名作为参数启动应用程序 A 我用这段代码做到这一点 var basePath Environment GetFolderPat
  • 单元测试依赖注入

    我在用Autofac for IoC 这是我的容器启动器类 其职责是注册依赖项 public class ContainerInit public static IContainer BuildContainer var conFac ne
  • 使用迭代器与索引访问向量元素有什么区别?

    使用迭代器与索引访问向量元素有什么优点 为什么迭代器比索引更好 在索引不可用的情况下 例如 std list 对于 例子 在通用函数接受迭代器的情况下 叫做 编写应该使用的函数模板时 不止一种容器类型 他们的存在是为了创造均匀性在所有容器和
  • 仅仅“抛出”一次捕获有好处吗?

    与一位同事就他将大部分功能包装在 try catch 中的做法进行了 激烈辩论 但 catch 中只有一个 抛出 例如 Private sub foo try Do something catch throw And nothing els
  • EasyMock - 由于无法访问父类私有对象(i18n)而引发 NullPointerException

    A Class Parent4 private I18nUtils i18n Here Nullpointerexception occur public Parent4 SetText i18n getText HELLO B Class
  • 如何在预处理器中检测X32 ABI或环境?

    X32是一个 ABIamd64 x86 64使用 32 位指针的 CPU 这个想法是将 x86 64 的较大寄存器集与 32 位指针产生的较小内存和缓存占用空间结合起来 它可提供高达约 40 的加速 看x86 x32 和 x64 架构之间的
  • 将 HTML 渲染为图像

    我正在基于动态输入和裁剪图像生成优惠券 并且现在使用 ntml 和 css 显示优惠券 问题是 打印这已成为一个问题 因为打印时背景如何消失以及其他问题 所以我认为最好的解决方案是能够基于html生成图像 或者设置某种接受字符串和图像的模板
  • C:分段错误:GDB:<读取变量时出错>

    我有一个函数shortestPath 它是Dijkstra算法的修改实现 用于我正在为comp2类开发的棋盘游戏AI 我浏览了网站并使用 gdb 和 valgrind 我确切地知道段错误发生的位置 实际上几个小时前就知道了 但无法弄清楚是什
  • 如何在调试 C 程序时将 gdb 值转换为 python 数字对象

    我在调试 C 程序时使用 python2 6 的 gdb 模块 并希望根据实例的 Type 将 gdb Value 实例转换为 python 数字对象 变量 例如 把我的C程序SomeStruct gt some float val 1 6
  • 如何开玩笑地使用 --changedSince 和 --onlyChanged ?

    我想用改变自 https jestjs io docs en cli html changedsince and 仅更改 https jestjs io docs en cli html onlychanged开玩笑的标志 我更改了很多测试
  • 在heroku上运行c++程序

    我正在尝试在 Heroku 上运行 C 程序 我读过这篇文章 但是我没能成功 因为服务器上没有 g 或 gcc 我尝试像这样将 g 下载到服务器上sudo apt get install g 但是我没有root权限 我还尝试将 g 副本复制
  • 如何为 Office AddIn 创建静默安装程序

    我在为使用 C 中的 VSTO 开发的 Outlook 加载项创建静默安装程序时遇到问题 安装程序是由 clickOnce 生成的 Outlookaddin vsto 此加载项将由 SCCM 在多台计算机上发布 我需要静默安装 但当软件包到
  • 如何将 ContextMenuStrip 添加到 ToolStripMenuItem

    我希望当我单击菜单项时 显示一个包含 删除 重命名 等项目的上下文菜单 当右键单击菜单项时 如何将自身绑定为上下文菜单 我脑海中跳出的第一个想法是连接一些MouseDown事件于ToolStripMenuItem并显示第二个ContextM
  • 解析日期时间字符串

    我在使用 DateTime ParseExact 解析 DateTime 字符串时遇到一些困难 DateTime result CultureInfo provider CultureInfo InvariantCulture Parse

随机推荐

  • 无法从回调中更新 的 textContent(分配给变量)

    我有一个简单的 HTML 页面 当我按下 玩家 1 和 玩家 2 按钮时 我希望更改反映在页面上 在控制台分数上升 一切都很好 但为什么页面不更新更改后的分数 let p1score and let p2score 这是我的代码 谢谢 co
  • intellij idea:如何调试 java:fx maven 项目?

    我有一个旧的 javafx 应用程序 我必须通过执行以下操作来运行它mvn javafx run但现在我想用intellij idea 调试它 如果我调试用于运行它的配置 调试器会连接 但不会在任何断点处停止 如果我尝试运行 mvn 命令
  • facebook javascript SDK:FB.Canvas.setAutoResize iFrame 不起作用?

    我们使用 ruby rails 和 facebooker iframe 应用程序 构建了一个 facebook 应用程序 目前仍使用 FB Canvas setAutoResize 这在某些情况下似乎会失败 使用 facebook 开发人员
  • 如何允许我的网站嵌入 iframe 中?

    我有一个托管在外部服务器上的网站 我希望能够从本地开发环境 localhost 运行它 在 iframe 内 不幸的是 当我尝试使用 iframe 加载页面时 我在框架内容中收到 此内容无法在框架中显示 消息 我该如何解决这个问题 使用 i
  • CPU指令重排序的踪迹

    我研究了一些有关处理器指令重新排序和 Tomasulo 算法的内容 为了进一步了解这个主题 我想知道是否有任何方法可以 获取跟踪 查看给定程序完成的实际动态重新排序 我想给出一个输入程序并查看我的程序的 乱序指令执行跟踪 我可以使用 IBM
  • 使用 document.createElement 创建的元素是否保留在内存中?

    你好 我正在慢慢制作一个chrome扩展 我需要解析一些包含html实体的数据 并且我需要对其进行解码 我在这里的一个答案中看到我可以使用document createElement为此 我这样做了 htmlDecode function
  • CSS - 百分比还是像素?

    我已经使用CSS很多年了 而且我一直是一个 百分比 类型的人 因为我总是使用百分比而不是像素来定义高度和宽度 除了 例如 当设置诸如边距之类的东西时 填充等 在这种情况下我使用像素 我会做这样的事情 body height 99 width
  • delphi中如何直接从内存中执行代码?

    是否可以模仿loadlibrary功能 我想从 BLOB 字段加载库 而不先将其写入临时文件 并且我需要一个不依赖于特定版本的 delphi 编译器或 Windows 的解决方案 并且不会触发防病毒软件 是的 你可以 但你不需要loadli
  • 配置 ASP.NET 在 x64 Windows 上使用 x86

    我正在尝试部署GAL 修饰符 http galmod codeplex com 这是一个在 Windows 2003 x64 计算机上使用 Microsoft Access 的 ASP NET 网站 然而 x64 上没有 JET 驱动程序
  • 我的应用程序二进制文件在 Xcode 中的哪里提交?

    我已经为 App Store 前 iTunes 商店 构建了一个应用程序 但是 我不知道如何提交应用程序 我需要提交到 App Store 的实际二进制文件在哪里 它内置在哪个文件夹中 您可以使用 XCode 并在左侧展开 产品 突出显示您
  • 仅当用户下拉表格时显示搜索栏

    我有一个表格视图 上面有一个搜索栏 我的要求是当有人打开页面时不显示搜索栏 但当有人向下滑动表格时搜索栏应该可见 在你的控制器中viewDidAppear 方法 设置表视图的 contentOffset 属性 在 UIScrollView
  • 如何让WebStorm解析模块是函数?

    WebStorm 在解析从 CommonJS 模块作为方法返回的函数 并读取与它们关联的 JsDoc 方面做得非常好 例如 utils valid js Returns true no matter what param HTMLEleme
  • Python Pandas - 如果某些值为空则合并行

    我有一个看起来有点像这样的数据集 ID Name Address Zip Cost 1 Bob the Builder 123 Main St 12345 1 Bob the Builder 99 999 99 2 Bob the Buil
  • 在 WCF 中支持 Mtom 和 Text 作为 MessageEncoding

    我有一个 WCF 服务 它有一个具有以下签名的方法 object GetCommand Guid apiKey SocialService service string name object argument 它使用对象作为返回类型和最后
  • gdb不会执行二进制操作

    我有以下代码 include
  • 如何设置 Android 动态壁纸图标(又名“缩略图”)

    我构建了我的第一个 Android 应用程序 它是专为2 2设计的动态壁纸 当我按住屏幕时 选择Wallpapers然后选择Live Wallpapers 我的动态壁纸看起来像默认图标 上面覆盖了我的动态壁纸的名称 如何设置这个图标 我的清
  • Visual Studio 2013(更新 3)中的默认移动构造函数

    过去我已经找到了有关此问题的多个对话 例如here https stackoverflow com questions 4819936 why no default move assignment move constructor 但这样的
  • 如何使用 docker-compose 链接两个容器

    目前我有两个容器 我从图像构建然后链接这两个容器 例如 mysql docker build t my mysql docker mysql docker run p 3306 3306 name mysql d my mysql late
  • 如何在angularjs表达式中将字符串转换为数字或日期

    我正在使用 angularjs 来制作分页类型的东西 假设我有一个 2D 数组 并且我正在显示其中的值 它工作正常 但我也希望能够编辑这些值 所以我在输入标记中使用了 ng hide 它工作正常 但问题是 如果输入类型是数字或日期 而我的数
  • Moq:对依赖 HttpContext 的方法进行单元测试

    考虑 NET 程序集中的一个方法 public static string GetSecurityContextUserName extract the username from request string sUser HttpCont