目录

介绍

背景

使用代码

兴趣点


要测试REST API控制器的数据模型的验证,仅创建控制器类的实例并调用预期的方法是不可行的。它只是不测试验证,而只是跳过验证。我们需要一个真正的REST调用,但是我们需要从xUnit测试中获得它,而不是在手动启动应用程序时进行手动调用。两个软件包(Refit和IntegrationFixture)可以为我们提供帮助,本文介绍了如何做。

介绍

使用xUnit,实际上很容易调用方法并验证响应。但是,方法调用并不总是反映实际情况。例如,在执行REST API调用以触发控制器方法时,可能首先要进行一些验证。该验证可能不是您的应用程序本身的一部分,而是由诸如[Required]的验证属性设置的。本文介绍了如何轻松解决该问题。您不需要太多的样板代码,只需要正确的软件包和技巧即可。

背景

如果您对.NET Core的xUnit和REST API开发有一定的经验,它将帮助您理解此处给出的解释。

使用代码

这是我们要测试的方法。它根据名字和姓氏返回全名。中间名也可以包括在内,但是是可选的。

[HttpPost]
public ActionResult<string> Post([FromBody] Name value)
{return Ok($"{value.FirstName} {value.MiddleName} {value.LastName}");
}

从逻辑上讲,数据模型也需要实现。

public class Name
{[Required]public string FirstName { get; set; }public string MiddleName { get; set; }[Required]public string LastName { get; set; }
}

从上面显示的代码可以清楚地看出,名字和姓氏是必需的。中间名不是。

我们不能只从控制器实例中调用controller方法。这将跳过由验证属性触发的验证。但是,我们可以通过启动并执行REST调用来手动测试应用程序。从逻辑上讲,这很难用xUnit实现,也很难成为CI构建的一部分。解决方法如下:

首先,在使应用程序自托管成为测试的一部分时,我们需要一个Refit接口来进行一次调用。改装可作为NuGet包提供。接口如下所示:

public interface ILogicClient
{[Post("/api/logic")]Task<ApiResponse<string>> Post([Body] Name name);
}

现在,我们需要在测试中以编程方式创建一个实现和实例。为此,我们需要一个新的NuGet软件包,该软件包也支持自托管。该软件包(IntegrationFixture)也可以作为NuGet软件包使用。

[Theory]
[InlineData("Boris","Alexander", "Johnson", HttpStatusCode.OK, "Boris", "Alexander", "Johnson")]
[InlineData("Boris", "Alexander", null, HttpStatusCode.BadRequest)]
[InlineData(null, "Alexander", "Johnson", HttpStatusCode.BadRequest)]
[InlineData("Boris", "Alexander", "", HttpStatusCode.BadRequest)]
[InlineData("", "Alexander", "Johnson", HttpStatusCode.BadRequest)]
public async Task NamesTest(string firstName, string middleName, string lastName, HttpStatusCode expectedStatusCode, params string[] responseContains)
{using (var fixture = new RefitFixture<Startup, ILogicClient>(RestService.For<ILogicClient>)){var refitClient = fixture.GetRefitClient();var response = await refitClient.Post(new Name{FirstName = firstName,MiddleName = middleName,LastName = lastName,});var statusCode = response.StatusCode;Assert.Equal(expectedStatusCode, statusCode);var content = response.Content;foreach (var expectedResponse in responseContains){Assert.Contains(expectedResponse, content);}}
}

从上面的代码可以清楚地看到,我们有几个测试用例。根据可用的名称,返回特定的状态码。这就是验证属性应该触发的内容,所以这就是我们要声明的内容。此外,当获得肯定结果时,我们还声明响应的内容。现在问题已解决。在这里RefitFixture至关重要。它知道用于启用应用程序自我托管的Startup类。此外,它也知道用于对自托管应用程序进行REST调用的改装接口ILogicClient。这就解决了我们的问题:我们可以使用xUnit测试验证属性,而无需启动应用程序。本文中的代码可在GitHub上获得。

兴趣点

对我来说,提到的NuGet包中的RefitFixture类确实很有帮助。当我刚开始开发.NET Core应用程序时,我手动执行了应用程序以测试验证。这不再需要。验证和其他类似中间件的事物可以使用xUnit进行测试,就像常规的单元测试一样。

使用xUnit测试验证属性相关推荐

  1. java xunit_如何正确编写异步XUnit测试?

    我正在使用异步xUnit测试,我注意到不一致的传递行为: public async Task FetchData() { //Arrange var result = await arrangedSe ...

  2. Faiss优化:针对OMP_NUM_THREADS环境变量设置的测试验证

    前言 记录一下Faiss在项目使用中的一些优化,对OMP_NUM_THREADS 环境变量参数的测试验证- OMP_NUM_THREADS 用于控制线程并发数.测试条件:单个循环请求,持续时间大于15 ...

  3. 【亲测】二极管电压测试“跳坑”注意事项——硬件的板载测试验证

    硬件的板载测试验证是什么 在电路设计开发中,电路板上的一些基础器件(二极管.三极管.磁性器件等)在设计初的性能指标是理想的,但最终实际样板调试却发现性能相差甚远.究竟是前端设计环节的问题,还是后期样板 ...

  4. docker安装pocbox(漏洞测试验证辅助平台)

    PoCBox - 漏洞测试验证辅助平台 开发这个平台的初衷是帮助自己在漏洞挖掘测试中更加方便快捷的辅助自己进行漏洞验证. 一开始的想法是框架化.模块化,但是开发着开发着就发现有点累,于是采用了原始的方 ...

  5. 华为成功完成中国联通NFV三层解耦测试验证

    NFV将运营商的网络通过虚拟化等IT技术进行网络架构重构,将传统的电信专用硬件+专用软件的方式转型为应用软件+云操作系统+通用硬件的三层解耦架构,各层可以独立演进,云操作系统基于Openstack开源 ...

  6. 东莞华勤通讯软件测试怎么样,【社招】华勤通讯NBD测试验证部急聘岗位-东莞...

    原标题:[社招]华勤通讯NBD测试验证部急聘岗位-东莞 硬件测试工程师 岗位职责: 1.负责完成和协调项目硬件电性能相关测试工作: 2.负责各项性能指标的测试.分析并对相关标准进行修订: 3.负责项目 ...

  7. html5表单新增验证属性,HTML5表单增强属性

    email 此类型要求输入格式正确的email地址,否则浏览器是不允许提交的,并会有一个错误信息提示.此类型在Opera中必须指定name值,否则无效果. url 要求输入格式正确的URL地址,Ope ...

  8. [原创]网站HTML,XHTML,XML,WML,CSS等测试验证工具介绍

    [原创]网站HTML,XHTML,XML,WML,CSS等语言测试验证工具介绍 1 在线网站语言测试检查网站: HTML和XHTML测试检查网站: http://validator.w3.org/ 或 ...

  9. 如何测试验证linux下的CAN接口

    前言 嵌入式linux下的CAN接口,如何方便地测试验证是一个问题.实际上Linux系统已经自带了测试验证的软件工具. 环境 硬件:NXP IMX6Solox,Kvaser Can Card 软件:嵌 ...

最新文章

  1. 36晋级12第四场:评委弃权 无人晋级
  2. 技术面试的《飞鸽传书2007绿色版下载》
  3. 堆内存 和 栈内存的简单理解 (未完待续~)
  4. 使用Java模拟登录KINGOSOFT青果教务系统(湖北三峡职业技术学院)
  5. FreeSSL.cn 创建免费 https 证书
  6. 概率论考点之二项式定理与组合数证明
  7. poi 3.17合并单元格报错 java.lang.IllegalArgumentException: Merged region A1 must contain 2 or more cells
  8. SpringBoot分布式项目实现Session共享
  9. 明通智能:EA交易外汇ea能稳定盈利吗?
  10. 梦三国2英霸模式貂蝉攻略(玩大流)
  11. yum 安装程序找不程序安装包,诸如类似 No package zlib-devel available 报错的解决
  12. 【天光学术】汉语言文学论文:浅谈农村初中文言文教学现状及有效策略
  13. Twitter与微博
  14. linux的dhcp服务
  15. 还原SQL数据库,执行 Transact-SQL 语句或批处理时发生了异常
  16. 【Python 爬虫小项目 01】租房数据
  17. Android Camera 架构
  18. MySQL用户创建、登录等(超详细)
  19. xlwings模块(数据保存为xlsx文件)
  20. MES与APS集成化探讨

热门文章

  1. postgre sql 括字段_【技术干货】30个最适合初学者的SQL查询
  2. mmu计算机组成原理,计算机组成原理
  3. win python 怎么打开建立一个孤立的进程_python实现在windows服务中新建进程的方法...
  4. eclipse启动springboot项目_多模块项目中的一个Spring Boot启动错误
  5. linux按括号截取字符串,Linux作业4
  6. 年货节页面PSD分层模板,拿稳了!应急!
  7. 浪漫七夕节丨中国情人节营销海报模板
  8. 手机UI界面模板psd源文件格式!
  9. opengl 如何加阴影_零基础如何2个月上岗C++工程师(内附资料)
  10. Linux网络协议栈:一个TCP链接的耗时