c# – 单元测试中的Mock IHttpContextAccessor
发布时间:2020-12-15 08:21:48 所属栏目:百科 来源:网络整理
导读:我有一个方法来使用IHttpContextAccessor获取标头值 public class HeaderConfiguration : IHeaderConfiguration{ public HeaderConfiguration() { } public string GetTenantId(IHttpContextAccessor httpContextAccessor) { return httpContextAccessor.Htt
我有一个方法来使用IHttpContextAccessor获取标头值
public class HeaderConfiguration : IHeaderConfiguration { public HeaderConfiguration() { } public string GetTenantId(IHttpContextAccessor httpContextAccessor) { return httpContextAccessor.HttpContext.Request.Headers["Tenant-ID"].ToString(); } } 我正在测试GetBookByBookId方法 假设该方法如下所示: public class Book { private readonly IHttpContextAccessor _httpContextAccessor; private IHeaderConfiguration _headerConfiguration; private string _tenantID; public Book(IHeaderConfiguration headerConfiguration,IHttpContextAccessor httpContextAccessor){ var headerConfig = new HeaderConfiguration(); _httpContextAccessor = httpContextAccessor; _tenantID = headerConfig.GetTenantId(_httpContextAccessor); } public Task<List<BookModel>> GetBookByBookId(string id){ //do something with the _tenantId //... } } 这是我对GetBookByBookId方法的单元测试 [Fact] public void test_GetBookByBookId() { //Arrange //Mock IHttpContextAccessor var mockHttpContextAccessor = new Mock<IHttpContextAccessor>(); mockHttpContextAccessor.Setup(req => req.HttpContext.Request.Headers["Tenant-ID"].ToString()).Returns(It.IsAny<string>()); //Mock HeaderConfiguration var mockHeaderConfiguration = new Mock<IHeaderConfiguration>(); mockHeaderConfiguration.Setup(x => x.GetTenantId(mockHttpContextAccessor.Object)).Returns(It.IsAny<string>()); var book = new Book( mockHttpContextAccessor.Object,mockHeaderConfiguration.Object); var bookId = "100"; //Act var result = book.GetBookByBookId(bookId); //Assert result.Result.Should().NotBeNull().And. BeOfType<List<BookModel>>(); } 但对于这一行: mockHttpContextAccessor.Setup(req => req.HttpContext.Request.Headers["Tenant-ID"].ToString()).Returns(It.IsAny<string>()); 它说
我想知道用标题值模拟IHttpContextAccessor的正确方法是什么? 解决方法
您可以使用DefaultHttpContext作为IHttpContextAccessor.HttpContext的支持.节省您必须设置太多东西
接下来,您不能使用It.IsAny< string>()作为返回结果.它们仅用于设置表达式. 检查重构器 [Fact] public async Task test_GetBookByBookId() { //Arrange //Mock IHttpContextAccessor var mockHttpContextAccessor = new Mock<IHttpContextAccessor>(); var context = new DefaultHttpContext(); var fakeTenantId = "abcd"; context.Request.Headers["Tenant-ID"] = fakeTenantId; mockHttpContextAccessor.Setup(_ => _.HttpContext).Returns(context); //Mock HeaderConfiguration var mockHeaderConfiguration = new Mock<IHeaderConfiguration>(); mockHeaderConfiguration .Setup(_ => _.GetTenantId(It.IsAny<IHttpContextAccessor>())) .Returns(fakeTenantId); var book = new Book(mockHttpContextAccessor.Object,mockHeaderConfiguration.Object); var bookId = "100"; //Act var result = await book.GetBookByBookId(bookId); //Assert result.Should().NotBeNull().And. BeOfType<List<BookModel>>(); } Class In Test也可能存在问题,因为它应该在实际显式注入时手动初始化HeaderConfiguration. public Book(IHeaderConfiguration headerConfiguration,IHttpContextAccessor httpContextAccessor) { _httpContextAccessor = httpContextAccessor; _tenantID = headerConfiguration.GetTenantId(_httpContextAccessor); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- oracle 10g在前面包含数字时订购varchar列
- Node.js和Express简单入门介绍
- net.sf.json.JSONException: There is a cycle in the hier
- cocos2dx之onEnter,onExit
- Swift,NSJSONSerialization和NSError
- reactjs – React Native Navigator – 转换并卸载前一个场
- 【麦可网】Cocos2d-X跨平台游戏开发学习笔记---第二十二课:
- 如何在PostgreSQL查询中显示行号?
- ehcache.xml配置文件说明
- 用Reactor模式构建的Kafka Server网络层和API层---架构和设