当前位置: 移动技术网 > IT编程>开发语言>.net > 使用 xUnit 编写 ASP.NET Core WebAPI单元测试

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

2019年04月06日  | 移动技术网IT编程  | 我要评论

五毒教众崇拜神,空气压缩机,盗情新浪共享

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

一、创建示例项目

模板为我们自动创建了一个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的引用,不需要我们手动去nuget导入了,现在从nuget中添加microsoft.aspnetcore.app和microsoft.aspnetcore.testhost,xunit项目并添加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()代码块内右键->运行测试,或者打开测试资源管理器,运行所选测试

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

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

 

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

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网