首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在.NET测试中传入模拟的HttpClient?

如何在.NET测试中传入模拟的HttpClient?
EN

Stack Overflow用户
提问于 2014-03-06 11:32:08
回答 3查看 23.4K关注 0票数 56

我有一个使用Microsoft.Net.Http来检索一些Json数据的服务。太棒了!

当然,我不希望我的单元测试命中实际的服务器(否则,这是一个集成测试)。

下面是我的服务ctor (它使用依赖注入...)

代码语言:javascript
运行
AI代码解释
复制
public Foo(string name, HttpClient httpClient = null)
{
...
}

我不知道我怎么能用..。比方说..MoqFakeItEasy

我希望确保当我的服务调用GetAsyncPostAsync时..然后我就可以伪造那些电话了。

有什么建议可以让我这样做吗?

我希望我不需要自己做包装纸..因为那是废话:(微软不可能对此进行疏忽,对吧?

(是的,制作包装纸很容易。我以前做过..。但这就是重点!)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-08 03:09:54

您可以将核心HttpMessageHandler替换为假的。看起来像这样的东西。

代码语言:javascript
运行
AI代码解释
复制
public class FakeResponseHandler : DelegatingHandler
{
    private readonly Dictionary<Uri, HttpResponseMessage> _FakeResponses = new Dictionary<Uri, HttpResponseMessage>();

    public void AddFakeResponse(Uri uri, HttpResponseMessage responseMessage)
    {
        _FakeResponses.Add(uri, responseMessage);
    }

    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
    {
        if (_FakeResponses.ContainsKey(request.RequestUri))
        {
            return Task.FromResult(_FakeResponses[request.RequestUri]);
        }
        else
        {
            return Task.FromResult(new HttpResponseMessage(HttpStatusCode.NotFound) { RequestMessage = request });
        }
    }
}

然后,您可以创建一个将使用假处理程序的客户端。

代码语言:javascript
运行
AI代码解释
复制
var fakeResponseHandler = new FakeResponseHandler();
fakeResponseHandler.AddFakeResponse(new Uri("http://example.org/test"), new HttpResponseMessage(HttpStatusCode.OK));

var httpClient = new HttpClient(fakeResponseHandler);

var response1 = await httpClient.GetAsync("http://example.org/notthere");
var response2 = await httpClient.GetAsync("http://example.org/test");

Assert.Equal(response1.StatusCode,HttpStatusCode.NotFound);
Assert.Equal(response2.StatusCode, HttpStatusCode.OK);
票数 96
EN

Stack Overflow用户

发布于 2015-12-11 19:40:10

我知道这是一个古老的问题,但我在搜索这个话题时遇到了这个问题,并找到了一个非常好的解决方案,使测试HttpClient变得更容易。

它可以通过nuget获得:

https://github.com/richardszalay/mockhttp

代码语言:javascript
运行
AI代码解释
复制
PM> Install-Package RichardSzalay.MockHttp

下面是对用法的快速了解:

代码语言:javascript
运行
AI代码解释
复制
var mockHttp = new MockHttpMessageHandler();

// Setup a respond for the user api (including a wildcard in the URL)
mockHttp.When("http://localost/api/user/*")
        .Respond("application/json", "{'name' : 'Test McGee'}"); // Respond with JSON

// Inject the handler or client into your application code
var client = new HttpClient(mockHttp);

var response = await client.GetAsync("http://localost/api/user/1234");
// or without await: var response = client.GetAsync("http://localost/api/user/1234").Result;

var json = await response.Content.ReadAsStringAsync();

// No network connection required
Console.Write(json); // {'name' : 'Test McGee'}

在github项目页面上有更多信息。希望这能对你有所帮助。

票数 19
EN

Stack Overflow用户

发布于 2014-03-06 11:53:44

您可能会看看Microsoft Fakes,特别是Shims-section。使用它们,您可以修改HttpClient本身的行为。前提条件是,您使用的是VS Premium或Ultimate。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22223223

复制
相关文章
一、导航菜单_苹果cms什么导航菜单
即页面样式,组成很简单,即一个文本输入框<input>和一个搜索图标,这里图标可以自行搜索下载一个,或者像下面一样使用在线图标,全部代码如下:
全栈程序员站长
2022/09/19
4.1K0
一、导航菜单_苹果cms什么导航菜单
Jekyll 文章侧边索引导航
  Jekyll 与 Hexo 不同之处有很多,其中一处是在文章页面中不支持原生 [TOC] Markdown 语法来自动生成目录。而在 Hexo 中,即使主题不支持侧边悬浮的优化目录导航,也可以通过最简单的方式在文章的开始位置生成目录。虽然这种目录永远固定在文章开始的地方,但是总算是能够通过大小标题来给读者一个大概的思路。
zhonger
2022/10/28
1.6K0
Jekyll x Liquid 控制文章列表只显示特定类别的Post
这个也很简单, 只需要立一个 Flag循环判断是否含有这个 Tag 就行 o(
szhshp
2022/08/15
4830
转义,解决花括号在 Jekyll 被识别成 Liquid 代码的问题
发布于 2017-10-12 16:08 更新于 2018-08-12 06:49
walterlv
2018/09/18
1.4K0
各类导航菜单
以下内容由于涉及到很多学习DEMO 和 下载链接,建议在PC端查看。以下资料都来自站长素材。
用户7293182
2022/01/17
2.4K0
HTML导航菜单
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/159456.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/17
6.1K0
使用 WordPress 的导航菜单
WordPress 原来默认的导航菜单只能是页面,或者分类,或者两者,如果想自己加入一个自定义链接都需要修改主题,非常不方便,所以一个完全可定制化的自定义的 WordPress 导航菜单成了所有人的需求。
Denis
2023/04/14
2K0
使用 WordPress 的导航菜单
导航菜单优化制作
摘要总结:本文主要介绍了如何利用JavaScript语言实现一个具有轮播效果和鼠标悬浮弹出菜单的导航菜单。首先介绍了JavaScript语言的基础知识,然后详细讲解了如何利用JavaScript语言实现轮播效果和鼠标悬浮弹出菜单。最后介绍了如何使用JavaScript语言实现导航菜单的交互功能。
IMWeb前端团队
2017/12/29
3.7K0
导航菜单优化制作
导航菜单优化制作
以前制作导航菜单,总要加许多id在HTML中,js代码也要将id挨个加上去,今日终于习得破解之法,不在用以前那种笨拙的方法了。
IMWeb前端团队
2019/12/03
2.7K0
wordpress输出导航菜单
更多参照 https://developer.wordpress.org/reference/functions/wp_get_nav_menu_items/
切图仔
2022/09/14
1.8K0
wordpress输出导航菜单
bootstrap nav 导航菜单
nav nav-tabs <p>标签式的导航菜单</p> <ul class="nav nav-tabs"> <li class="active"><a href="#">Home</a></li> <li><a href="#">SVN</a></li> <li><a href="#">iOS</a></li> <li><a href="#">VB.Net</a></li> <li><a href="#">Java</a></li> <li><a href="#">PHP</a></li> </ul>
用户5760343
2019/07/05
4.9K0
bootstrap nav 导航菜单
layui响应式导航(菜单)
今天来分享一套自己写的layui响应式导航栏菜单,网络上搜索无果,只能自己写了,现在分享出来。
申霖
2019/12/27
5.1K0
layui响应式导航(菜单)
为带有多种语言的 Jekyll 博客添加多语言选择
发布于 2018-03-06 06:47 更新于 2018-09-01 00:13
walterlv
2018/09/18
1.6K0
二级导航菜单[通俗易懂]
本文用html5+css实现了二级导航菜单,二级导航菜单在网站建设中使用的越来越广泛。 效果图如下:
全栈程序员站长
2022/09/19
5.1K0
二级导航菜单[通俗易懂]
jquery导航菜单「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/159432.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/17
5.9K0
jquery导航菜单「建议收藏」
bootstrap 常用导航菜单样式
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Bootstrap 实例 - 标签页与胶囊式标签页</title> <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css"> <script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script> <script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script> </head> <body>
用户5760343
2019/07/05
6.3K0
Suffusion设置主导航菜单
换用Suffusion主题之后,把菜单栏变成导航横到网站上方了,但是过了很久之后发现不知道以前从哪里设置的这些东西,今天偶然又找到,赶紧记录下来,以防忘记。
the5fire
2019/02/28
1.4K0
Element UI导航菜单(NavMenu),动态多级菜单实现
今天同事封装一个导航栏的组件,使用的 Element UI 的 NavMenu 组件。
德顺
2020/12/28
15.2K0
html导航栏可以展开的下拉菜单,html导航栏下拉菜单如何制作[通俗易懂]
小编给大家分享一下html导航栏下拉菜单如何制作,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!
全栈程序员站长
2022/09/01
8.9K0
点击加载更多

相似问题

如何在mysql工作台中更改字体大小?

10

在控制台中动态更改字体

41

如何在mysql工作台中更改varchar

14

在MySQL工作台中连接MySQL失败

14

如何在mysql工作台中更改用户

33
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文