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

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.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 对象加入依赖注入容器中

结语

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

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