欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

使用 xUnit 编写 ASP.NET Core WebAPI单元测试

程序员文章站 2022-07-11 22:12:22
本文使用xUnit对ASP.NET Core WebAPI做单元测试,使用HttpClient的同步和异步请求,下面详细介绍xUnit的使用过程: 一、创建示例项目 模板为我们自动创建了一个ValuesController控制器,保留里面的一个Get请求和Post请求方法,代码如下: 使用.NET ......

本文使用xunit对asp.net core webapi做单元测试,使用httpclient的同步和异步请求,下面详细介绍xunit的使用过程:

一、创建示例项目

使用 xUnit 编写 ASP.NET Core WebAPI单元测试

模板为我们自动创建了一个valuescontroller控制器,保留里面的一个get请求和post请求方法,代码如下:

    [route("api/[controller]")]
    [apicontroller]
    public class valuescontroller : controllerbase
    {
        // get api/values/5
        [httpget("{id}")]
        public actionresult<string> get(int id)
        {
            return $"value:{id}";
        }

        // post api/values
        [httppost]
        public actionresult<string> post(dynamic obj)
        {
            return $"姓名:{obj.name},年龄:{obj.age}";
        }
    }

使用.net core创建一个xunit单元测试项目,如图:

使用 xUnit 编写 ASP.NET Core WebAPI单元测试

项目的模板页已经为我们添加好了xunit的引用,不需要我们手动去nuget导入了,现在从nuget中添加microsoft.aspnetcore.app和microsoft.aspnetcore.testhost,xunit项目并添加webapi的项目引用,如下图所示:

使用 xUnit 编写 ASP.NET Core WebAPI单元测试

二、编写单元用例

 写单元测试一般有三个步骤:arrange,act 和 assert。

  • arrange 是准备阶段,这个阶段是准备工作,比如模拟数据、初始化对象等;
  • act 是行为阶段,这个阶段是用准备好的数据去调用要测试的方法;
  • assert 是断定阶段,就是把调用目标方法返回的值和预期的值进行比较,如果和预期一致说明测试通过,否则为失败。

 新建一个单元测试类:valuestest.cs;用于对valuescontroller进行单元测试。

 1、使用httpclient进行get请求测试,单元测试代码如下:

using microsoft.aspnetcore;
using microsoft.aspnetcore.hosting;
using microsoft.aspnetcore.testhost;
using newtonsoft.json;
using system.net;
using system.net.http;
using system.net.mime;
using system.text;
using system.threading.tasks;
using xunit;
using xunit.abstractions;

namespace webapi.xunit
{
    public class valuestests
    {
        public valuestests(itestoutputhelper outputhelper)
        {
            var server = new testserver(webhost.createdefaultbuilder()
                .usestartup<startup>());
            client = server.createclient();            
        }

        public httpclient client { get; }
        
        [fact]
        public async task getbyid_shouldbe_ok()
        {
            // arrange
            var id = 1;

            // act
            var response = await client.getasync($"/api/values/{id}");

            // assert
            assert.equal(httpstatuscode.ok, response.statuscode);
        }
    }
}

这里我们通过 testserver 拿到一个 httpclient 对象,用它我们可以模拟 http 请求。我们写了一个非常简单的测试用例,完整演示了单元测试的 arrange,act 和 assert 三个步骤。

 2、使用httpclient进行post请求测试,并用itestoutputhelper输出请求信息,单元测试代码如下:

 

using microsoft.aspnetcore;
using microsoft.aspnetcore.hosting;
using microsoft.aspnetcore.testhost;
using newtonsoft.json;
using system.net;
using system.net.http;
using system.net.mime;
using system.text;
using system.threading.tasks;
using xunit;
using xunit.abstractions;

namespace webapi.xunit
{
    public class valuestests
    {
        public valuestests(itestoutputhelper outputhelper)
        {
            var server = new testserver(webhost.createdefaultbuilder()
                .usestartup<startup>());
            client = server.createclient();
            output = outputhelper;
        }

        public httpclient client { get; }
        public itestoutputhelper output { get; }

        [fact]
        public async task post_shouldbe_ok()
        {
            var content = new stringcontent(jsonconvert.serializeobject(new { name = "cxt", age = 22 }), encoding.utf8, mediatypenames.application.json);

            var response = await client.postasync("/api/values", content);

            // output
            var responsetest = await response.content.readasstringasync();

            output.writeline(responsetest);

            assert.equal(httpstatuscode.ok, response.statuscode);
        }
    }
}

 3、运行测试用例,得到测试结果。

在当前的方法内,getbyid_shouldbe_ok()、post_shouldbe_ok()代码块内右键->运行测试,或者打开测试资源管理器,运行所选测试

使用 xUnit 编写 ASP.NET Core WebAPI单元测试

绿色的勾表示已经测试通过。

下面查看post请求的output打印结果:

使用 xUnit 编写 ASP.NET Core WebAPI单元测试

 

 通过上面两个测试用例,发现使用起来超级方便。