ASP.NET Core 单元测试:如何 Mock HttpContext.Features.Get()

点击上方蓝字关注“汪宇杰博客”

导语

在 ASP.NET Core 里,如果你想单元测试 HttpContext.Features.Get<SomeType>(),这个技巧一定不要错过。

问题

我有个 Error 页面,需要取得异常的详细信息。我使用 HttpContext.Features.Get<IExceptionHandlerPathFeature>() 方法。

public void OnGet()

{

    var requestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;

    var exceptionFeature = HttpContext.Features.Get<IExceptionHandlerPathFeature>();

    if (exceptionFeature is not null)

    {

        // Get which route the exception occurred at

        var routeWhereExceptionOccurred = exceptionFeature.Path;

        // Get the exception that occurred

        var exceptionThatOccurred = exceptionFeature.Error;

        _logger.LogError($"Error: {routeWhereExceptionOccurred}, " +

                         $"client IP: {HttpContext.Connection.RemoteIpAddress}, " +

                         $"request id: {requestId}", exceptionThatOccurred);

    }

    RequestId = requestId;

}

现在,我需要单元测试这段代码。通常,在需要 HttpContext的 Page 或 Controller 中,我会使用 DefaultHttpContext 的实例。但我发现 HttpContext 上的 Features 属性是只读的。因此没有办法将 mock 好的对象赋值给它。

namespace Microsoft.AspNetCore.Http

{

    public abstract class HttpContext

    {

        protected HttpContext();

        //

        // Summary:

        //     Gets the collection of HTTP features provided by the server and middleware available

        //     on this request.

        public abstract IFeatureCollection Features { get; }

        //  ...

    }

}

解决办法

首先,像平常一样准备 mock。在我的案例里,我需要配置 IFeatureCollection.Get() 方法,返回我想要的对象。

var mockIFeatureCollection = _mockRepository.Create<IFeatureCollection>();

mockIFeatureCollection.Setup(p => p.Get<IExceptionHandlerPathFeature>())

    .Returns(new ExceptionHandlerFeature

    {

        Path = "/996/icu",

        Error = new("Too much fubao")

    });

httpContextMock.Setup(p => p.Features).Returns(mockIFeatureCollection.Object);

下下来,为了给 HttpContext.Features 赋值,我们这次不能使用 DefaultHttpContext 了。我们需要创建 HttpContext 自己的 mock,并且配置 Features 属性返回刚才 mock 的 IFeatureCollection 对象。

var httpContextMock = _mockRepository.Create<HttpContext>();

httpContextMock.Setup(p => p.Features).Returns(mockIFeatureCollection.Object);

现在运行单元测试,我们可以看到正确的值已经输出了。

汪宇杰博客

Azure | .NET | 微软 MVP

无广告,不卖课,做纯粹的技术公众号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302715.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mini api

大部分主流语言都支持web框架&#xff0c;并且实现起来相对轻便&#xff0c;简捷&#xff0c;比如&#xff1a;go的gin包package main import "github.com/gin-gonic/gin" func main() {r : gin.Default()r.GET("/ping", func(c *gin.Context) {c.JSON(200…

edge robert matlab,哪位熟悉matlab的大神路过瞄一眼哈

cxfx(believe truth believe me)UID240430帖子100精华积分1755蛋蛋币1755 枚威望0BT积分0阅读权限60性别男在线时间125 小时注册时间2013-3-27鸵鸟蛋主楼大中小发表于 2013-5-13 21:30 只看该作者哪位熟悉matlab的大神路过瞄一眼哈求大神指点迷津那&#xff01;谁来帮着看一下这…

php 图片 3d旋转图片,html5实现图片的3D旋转效果

我们先来看一下实现效果&#xff1a;(学习视频分享&#xff1a;html视频教程)H5旋转3D相册&#xff0c;鼠标放置暂停&#xff0c;图片灰度级为0&#xff0c;有放大效果。该实例运用H5和CSS3动画效果&#xff0c;未用javascript。提高了本人对CSS3 新属性的了解及掌握。完整代码…

数据这么多,且看R语言怎么处理!

随着科技的不断进步&#xff0c;数据处理量的不断增大&#xff0c;对数据进行处理、分析、统计建模、数据挖掘以及可视化的重要性日渐突出。如果说有一门简单易学、通俗易懂并且集上述功能为一体的编程语言让科研人员从中解脱出来&#xff0c;R语言当仁不让。作为一种统计分析软…

乘风破浪,.Net Core遇见Dapr,为云原生而生的分布式应用运行时

Dapr是一个由微软主导的云原生开源项目&#xff0c;国内云计算巨头阿里云也积极参与其中&#xff0c;2019年10月首次发布&#xff0c;到今年2月正式发布V1.0版本。在不到一年半的时间内&#xff0c;github star数达到了1.2万&#xff0c;超过同期的kubernetes、istio、knative等…

催人泪下!一个程序员的悲惨故事

全世界有3.14 % 的人已经关注了数据与算法之美编辑&#xff1a;大数据二狗如果你喜欢这篇文章&#xff0c;就把它发给朋友看吧~精品课程推荐&#xff1a;选购数学科普正版读物严选“数学思维好物”送给孩子的益智礼物 | 办公室神器算法工程师成长阅读 | 居家高科技理工…

双十一,单身狗除了买买买,还能做什么?

躲得过618&#xff0c;躲得过1024终究躲不过双十一小天相信&#xff0c;肯定有很多的小伙伴正磨刀霍霍对准自己的手这个节日小天陪你们买买买&#xff01;11月6~13日超级数学建模携手网易云课堂“超级充电节”为大家带来多重惊喜&#xff0c;福利享不停&#xff01;趁此机会赶紧…

将 SharePoint 开发与其他形式的开发进行比较

从三个视点检查 SharePoint 开发很有用&#xff1a; 为 .NET Framework 构建可扩展的应用程序 构建数据库应用程序 构建传统的富客户端应用程序将 SharePoint 应用程序与可扩展的 .NET Web 应用程序进行比较 您可以从开发人员的角度检查 SharePoint 开发&#xff0c;该开发人员…

Visual Studio 2022这些重大更新,影响每一位.NET开发者!

难得五一长假&#xff0c;蹲家里盘点了一下这2年.NET的发展&#xff0c;可谓日新月异&#xff0c;重现辉煌&#xff0c;各种重磅更新接踵而至&#xff1a;1 .NET Core3.1各种最受欢迎、性能排行等榜单霸榜&#xff0c;3个月增加100w的关注者&#xff1b;2 .NET5让.NET Framewor…

影响计算机算法世界的十位大师

全世界有3.14 % 的人已经关注了数据与算法之美1、伟大的智者——Don E.Knuth&#xff0c;中文名&#xff1a;高德纳(1938-)算法和程序设计技术的先驱者。Oh,God!一些国外网站这样评价他。一般说来&#xff0c;不知道此人的程序员是不可原谅的。其经典著作《计算机程序设计艺术》…

【翻译】WPF中的数据绑定表达式

有很多文章讨论绑定的概念&#xff0c;并讲解如何使用StaticResources和DynamicResources绑定属性。这些概念使用WPF提供的数据绑定表达式。在本文中&#xff0c;让我们研究WPF提供的不同类型的数据绑定表达式。介绍数据绑定是一种强大的技术&#xff0c;它允许数据在UI元素和业…

12个关键词,告诉你到底什么是机器学习

全世界只有3.14 % 的人关注了数据与算法之美编者按&#xff1a;随着人工智能(AI)技术对各行各业有越来越深入的影响&#xff0c;我们也更多地在新闻或报告中听到“机器学习”、“深度学习”、“增强学习”、“神经网络”等词汇&#xff0c;对于非专业人士来说略为玄幻。这篇文章…

MFC多语言实现方法

2019独角兽企业重金招聘Python工程师标准>>> 一、字符放在DLL资源文件中&#xff0c;切换资源模块(程序默认使用exe模块资源)。 实现要点&#xff1a; 新建一个只包含资源的DLL。通过函数AfxSetResourceHandle设置资源模块。 示意代码为&#xff1a; AfxSetResource…

oracle dbfile数,通过案例学调优之--Oracle参数(db_file_multiblock_read_count)

通过案例学调优之--Oracle参数(db_file_multiblock_read_count)应用环境&#xff1a;操作系统&#xff1a; RedHat EL55Oracle&#xff1a; Oracle 10gR2Oracle DB_FILE_MULTIBLOCK_READ_COUNT是Oracle比较重要的一个全局性参数&#xff0c;可以影响系统级别及sessioin级别。…

转行程序员后,我开始后悔没做这件事

全世界有3.14 % 的人已经关注了数据与算法之美程序 数据结构 算法 ——图灵奖得主&#xff0c;计算机科学家N.Wirth(沃斯)作为程序员&#xff0c;我们做机器学习也好&#xff0c;做python开发也好&#xff0c;java开发也好。有一种对所有程序员无一例外的刚需 —— 算法与数据…

工业互联网的两种极端想法和两点反思

目 录1. 概述2. 两种极端想法3. 两点反思1. 概述最近走访了很多企业&#xff0c;涉及到的行业包括&#xff1a;军工、特钢、有色、加工制造&#xff08;海洋钻井平台&#xff09;、建材、纺织等&#xff0c;在与不同的行业交流的过程中&#xff0c;我发现…

兵马未至,数据先行,且看如何进行数据挖掘!

从数据中抽取信息从信息中挖掘知识随着大数据时代的到来&#xff0c;数据挖掘的重要性越发显著。可谓是兵马未至&#xff0c;数据先行。所谓数据挖掘&#xff0c;一般是指从大型数据库中将隐藏的预测信息抽取出来的过程&#xff0c;而更为精确的解释就是“从数据中挖掘知识”。…

微软加入字节码联盟,进一步开发支持Blazor 的WebAssembly技术

字节码联盟 (Bytecode Alliance)宣布已正式成为 501(c)(3) 非营利组织&#xff0c;参与组建的企业/组织包括 Fastly、英特尔、Mozilla 和微软&#xff0c;此外还邀请到了 Arm、DFINITY Foundation、Embark Studios、谷歌、Shopify 和加州大学圣地亚哥分校加入并成为正式会员。B…

传说中的贝叶斯统计到底有什么来头?

全世界有3.14 % 的人已经关注了数据与算法之美贝叶斯统计在机器学习中占有一个什么样的地位&#xff0c;它的原理以及实现过程又是如何的&#xff1f;本文对相关概念以及原理进行了介绍。引言&#xff1a;在很多分析学者看来&#xff0c;贝叶斯统计仍然是难以理解的。受机器学习…

更新两个WPF开源项目

前言好久没更新博客了&#xff0c;最近准备重拾博客&#xff0c;将更新恢复起来。开源项目这些年零零散散做了很多项目&#xff0c;准备整理一下&#xff0c;将其开源&#xff0c;现整理了两个项目&#xff1a;绑定引擎&#xff08;BindingEngine&#xff09;&#xff0c;插件式…