用Owin Host实现脱离IIS跑Web API单元测试

当前文章阅读前推荐阅读 OwinSelfHost自宿主的使用 文章
操作步骤与上述文章结构大致雷同:

第一步 新建控制台项目&&安装Nuget包

Install-package Microsoft.AspNet.WebApi.OwinSelfHost

第二步 新建操作类

Startup.cs
对OwinHost 所需的webapi配置

    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            var configuraton = new HttpConfiguration();

            configuraton.MapHttpAttributeRoutes();

            app.UseWebApi(configuraton);
        }
    }

ApiController
WebApi控制器的具体实例

   public class CommentsController : ApiController
    {
        [Route("blogposts/{postId}/comments")]
        public async Task Get(int postId)
        {
            var comments = new Comment[] { new Comment {
                PostId = postId,
                Body = "Coding changes the world1" } };
            return Ok(comments);
        }
    }

    public class Comment
    {
        public int PostId { get; set; }
        public string Body { get; set; }
    }

新建测试类

CommentsWebApiTest
使用OwinHost的方法脱离IIS的WebApi测试类

    public class CommentsWebApiTest : IDisposable
    {
        private const string HOST_ADDRESS = "http://localhost:8001";
        private IDisposable _webApp;
        private HttpClient _httClient;
        public CommentsWebApiTest()
        {
            _webApp = WebApp.Start(HOST_ADDRESS);
            Console.WriteLine("Web API started!");
            _httClient = new HttpClient();
            _httClient.BaseAddress = new Uri(HOST_ADDRESS);
            Console.WriteLine("HttpClient started!");
        }

        public void Dispose()
        {
            _webApp.Dispose();
        }

        [Fact]
        public async Task GetComments()
        {
            var postId = 1;
            var response = await _httClient.GetAsync($"http://localhost:8001/blogposts/1/comments");
            if (response.StatusCode != HttpStatusCode.OK)
            {
                Console.WriteLine(response.Content.ReadAsStringAsync());
            }
            Assert.Equal(HttpStatusCode.OK, response.StatusCode);
            var comments = await response.Content.ReadAsAsync();
            Assert.NotEmpty(comments);
            Assert.Equal(postId, comments[0].PostId);
            Assert.Equal("Coding changes the world1", comments[0].Body);
        }
    }

测试标签和类库引用

当使用测试标签的时候,[Fact],无法发现无法添加引用,如下图

image.png

图中所指示的地方如果出现引用问题,可以参照以下步骤进行引用
1.点击vs2017的工具->nuget包管理->解决方案的nuget程序包,在“”浏览“下输入“xunit”,选择xunit,然后选择步骤一中创建的项目,点击安装


image.png

2.其实此时的测试管理器根本就未运行单元测试,必须要借助xUnit中的运行环境,利用测试管理器来运行VS中的测试,此时我们继续在单元测试中通过NuGet安装xunit.runner.visualstudio,
点击vs2017的工具->nuget包管理->解决方案的nuget程序包,在“”浏览“下输入“xunit.runner.visualstudio”,选择xunit.runner.visualstudio,然后选择步骤一中创建的项目,点击安装


image.png

开始进行单元测试

编写单元测试代码后,右键点击“运行测试“”,即可执行单元测试,测试代码在后台直接运行,如果是点击“调试测试”,即可对测试单元进行断点调试

image.png

点击“运行测试”后会在Vs编辑器下方出现一个"测试资源管理器",在其中可以对所有的单元测试结果进行查看,如下图所示

image.png

你可能感兴趣的:(用Owin Host实现脱离IIS跑Web API单元测试)