Asp.Net Core 轻松学-利用xUnit进行主机级别的网络集成测试 (2)

3.3 TestServer 类代码量比较大,不过不要紧,我们只需要关注它的构造方法就可以了

public TestServer(IWebHostBuilder builder) : this(builder, new FeatureCollection()) { }

3.4 其构造方法接受一个 IWebHostBuilder 对象,只要我们传入一个 WebHostBuilder 就可以创建一个测试主机了
3.5 创建测试主机和 HttpClient 客户端,我们在测试类 ValuesUnitTest 编写如下代码

public class ValuesUnitTest { private TestServer testServer; private HttpClient httpCLient; public ValuesUnitTest() { testServer = new TestServer(new WebHostBuilder().UseStartup<Ron.TestDemo.Startup>()); httpCLient = testServer.CreateClient(); } [Fact] public async void GetTest() { var data = await httpCLient.GetAsync("/api/values/100"); var result = await data.Content.ReadAsStringAsync(); Assert.Equal("300", result); } }

代码解释
这段代码非常简单,首先,我们声明了一个 TestServer 和 HttpClient 对象,并在构造方法中初始化他们; TestServer 的初始化是由我们 new 了一个 Builder 对象,并指定其使用待测试项目 Ron.TestDemo 中的 Startup 类来启动,这样我们能可以直接使用待测试项目的路由和管道了,甚至我们无需指定测试站点,因为这些都会在 TestServer 自动配置一个 localhost 的主机地址

3.7 接下来就是创建了一个单元测试的方法,直接使用刚才初始化的 HttpClient 对象进行网络请求,这个时候,我们只需要知道 Action 即可,同时传递参数 100,最后断言服务器输出值为:"300",回顾一下我们创建的待测试方法,其业务正是将客户端传入的 id 值和配置文件 max 值相加后输出,而 max 值在这里被配置为 200

3.8 运行单元测试

Asp.Net Core 轻松学-利用xUnit进行主机级别的网络集成测试

3.9 测试通过,可以看到,测试达到了预期的结果,服务器正确返回了计算后的值

4. 配置文件注意事项

4.1 在待测试项目中的配置文件 appsettings.json 并不会被测试主机所读取,因为我们在上面创建测试主机的时候没有调用方法

WebHost.CreateDefaultBuilder

4.2 我们只是创建了一个 WebHostBuilder 对象,非常轻量的主机配置,简单来说就是无配置,如果对于 WebHost.CreateDefaultBuilder 不理解的同学,建议阅读我的文章 asp.netcore 深入了解配置文件加载过程.

4.3 所以,为了能够在单元测试中使用项目配置文件,我在 Ron.TestDemo 项目中的 Startup 类加入了下面的代码

public class Startup { public Startup(IConfiguration configuration, IHostingEnvironment env) { this.Configuration = new ConfigurationBuilder() .AddJsonFile("appsettings.json") .AddEnvironmentVariables() .SetBasePath(env.ContentRootPath) .Build(); } public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddSingleton<IConfiguration>(this.Configuration); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); } }

4.4 其目的就是手动读取配置文件,重新初始化 IConfiguration 对象,并将 this.Configuration 对象加入依赖注入容器中

结语

本文从单元测试入手,针对常见的系统集成测试提供了另外一种便捷的测试方案,通过创建 TestServer 测试主机开始,利用主机创建 HttpCLient 对象进行网络集成测试

减少重复启动程序和测试工具,提高了测试效率

充分利用了 Visual Studio 的优势,既可以做单元测试,还能利用这种测试方案进行快速代码调试

最后,还了解如何通过 TestServer 主机加载待测试项目的配置文件对象 IConfiguration

示例代码下载

https://files.cnblogs.com/files/viter/Ron.TestDemo.zip

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zywfwx.html