ASP.NET Web API 2 - 简单Unit Testing

翻译 2015年07月09日 08:43:51

资源:http://www.asp.net/web-api/overview/testing-and-debugging/unit-testing-with-aspnet-web-api

本文讲述的是为Web API 2 app创建简单的unit test。如何在solution中创建unit test,如何编写用来检查从controller方法中返回的值的test method(测试方法)。这里展示的仅仅是简单的数据场景,更多高级数据场景参考:ASP.NET Web API 2 - 模拟 EF(Entity Framework) 的Unit Testing。

创建Unit Test 项目

这里有两种方法:

  • 创建包含Unit Test的app

  • 在已存在的app中添加Unit Test

在solution上右键-> Add-> New Project-> Test-> Unit Test

创建Web API 2 app 

在Models下添加Products.cs后,build这个solution。

public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public decimal Price { get; set; }
    }
在Controllers下添加ProductController

 public class ProductController : ApiController
    {
        List<Product> products = new List<Product>(); //Refer to as DataBase
        public ProductController() { }

        public ProductController(List<Product> products ) //The constructor enables Unit Test to pass test data
        {
            this.products = products;
        }

        public IEnumerable<Product> GetAllProducts()
        {
            return products;
        }

        public async Task<IEnumerable<Product>> GetAllProductAsync() //Async Used by Unit Test
        {
            return await Task.FromResult(GetAllProducts()); // Task.FromResult to minimize extraneous code
        }

        public IHttpActionResult GetProduct(int id)
        {
            var product = products.FirstOrDefault((p) => p.Id == id);
            if (product == null)
            {
                return NotFound();
            }
            return Ok(product);
        }

        public async Task<IHttpActionResult> GetProductAsync(int id) //Async Used by Unit Test
        {
            return await Task.FromResult(GetProduct(id));
        }
    }

在Test中安装NuGet 包

右键Test project-> Manage NuGet Package -> install "Microsoft ASP.NET Web API 2 Core"

创建Tests

默认Test project下面有一个UnitTest1.cs,可以更改这个文件也可删除后重新添加。有一点需要注意的是,一定要是public class,不然运行不了。

本文中创建一个TestProductController.cs,该class中在[TestClass]标签下面,所有的方法都在[TestMethod]下面,run unit test的时候会自动运行TestClass类下面的TestMethod方法。

[TestClass]
    public class TestProductController
    {
        [TestMethod]
        public void GetAllProducts_ShouldReturnAllProducts()
        {
            var testProducts = GetTestProducts();
            var controller = new ProductController(testProducts);
            var result = controller.GetAllProducts() as List<Product>;
            if (result != null)
            {
                Assert.AreEqual(testProducts.Count,result.Count);
            }
        }

        [TestMethod]
        public async Task GetAllProductsAsync_ShouldReturnAllProducts()
        {
            var testProducts = GetTestProducts();
            var controller = new ProductController(testProducts);

            var result = await controller.GetAllProductAsync() as List<Product>;
            Assert.IsNotNull(result);
            Assert.AreEqual((object) testProducts.Count, result.Count);

        }

        [TestMethod]
        public void GetProduct_ShouldReturnCorrectProduct()
        {
            var testProducts = GetTestProducts();
            var controller = new ProductController(testProducts);

            var result = controller.GetProduct(3) as OkNegotiatedContentResult<Product>;
            Assert.IsNotNull(result);
            Assert.AreEqual(testProducts[2].Name,result.Content.Name);
        }

        [TestMethod]
        public async Task GetProductAsync_ShouldReturnCorrectProduct()
        {
            var testProducts = GetTestProducts();
            var controller = new ProductController(testProducts);

            var result = await controller.GetProductAsync(3) as OkNegotiatedContentResult<Product>;
            Assert.IsNotNull(result);
            Assert.AreEqual(testProducts[2].Name, result.Content.Name);
        }

        [TestMethod]
        public void GetProduct_ShouldNotFindProduct()
        {
            var controller = new ProductController(GetTestProducts());

            var result = controller.GetProduct(999);
            Assert.IsInstanceOfType(result,typeof(NotFoundResult));
        }

        private List<Product> GetTestProducts()
        {
            var testProducts = new List<Product>
            {
                new Product() {Id = 1, Name = "Demo1", Price = 1},
                new Product() {Id = 2, Name = "Deom2", Price = 2.3M},
                new Product() {Id = 3, Name = "Deom2", Price = 4.3M},
                new Product() {Id = 4, Name = "Deom2", Price = 6.3M}
            };
            return testProducts;
        }
    }


运行测试

在一再Test-> Run -> 运行指定test,所有test,查看覆盖率







python unittest做api自动化测试

python的flask api 自动化测试项目测试对于一个项目的重要性,大家应该都知道吧。 写python的朋友,应该都写过自动化测试脚本。 最近正好负责公司项目中的api测试, 下面写了一个简单的...
  • u010445540
  • u010445540
  • 2017年02月23日 16:59
  • 672

开始使用.NET CORE

这篇博客来使用.net core编写一个简单的项目,包含一个类库项目,一个类库项目的测试项目以及一个使用了类库项目的控制台项目,然后演示如何在多项目的模式下来调试代码。...
  • daguanjia11
  • daguanjia11
  • 2016年09月05日 22:58
  • 2398

ASP.NET Web API 2 - 简单Unit Testing

资源:http://www.asp.net/web-api/overview/testing-and-debugging/unit-testing-with-aspnet-web-api 本文讲述的是...
  • daimeisi123
  • daimeisi123
  • 2015年07月09日 08:43
  • 492

ASP.NET Web API中如何传递参数

 一、简单类型的传递   1、传递1个参数 获取方式: public Users Get(int id) 传递方式: (1)、api/default/5 (2)、$...
  • whaxrl
  • whaxrl
  • 2016年03月09日 10:07
  • 618

C/C++ unit testing tools

BoostDescription:The Boost Test Library provides a matched set of components for writing test progra...
  • abcpanpeng
  • abcpanpeng
  • 2010年12月01日 23:54
  • 4762

.NET Core 初探

使用VS Code 从零开始开发调试.NET Core 1.0。 .NET Core 是一个开源的、跨平台的 .NET 实现。 VS Code 全称是 Visual Studio Code,Vis...
  • qin_zhangyongheng
  • qin_zhangyongheng
  • 2017年02月13日 13:21
  • 1110

CSDN core test

The test for CSDN core
  • xinyuwuxian
  • xinyuwuxian
  • 2013年07月20日 23:22
  • 868

ASP.NET Web API 2框架揭秘

ASP.NET Web API2框架揭秘(.NET领域再现力作顶级专家精讲微软全新轻量级通信平台) 蒋金楠 著   ISBN 978-7-121-23536-8 2014年7月出版 定价:1...
  • broadview2006
  • broadview2006
  • 2014年07月18日 16:24
  • 3688

入门 ASP.NET Web API 2 (C#)

HTTP 不只是为了生成 web 页面。它也是一个强大的建设公开服务和数据的 Api的平台。 HTTP 的特性:简单、 灵活和无处不在。你几乎能想到的任何平台都有一个 HTTP 库,因此,HTTP 服...
  • brokge
  • brokge
  • 2013年12月09日 23:38
  • 22969

.Net Core 系列:1、环境搭建

2016年6月28日微软宣布发布 .NET Core 1.0、ASP.NET Core 1.0 和 Entity Framework Core 1.0,本文带你从搭建开发环境开始起步。...
  • sD7O95O
  • sD7O95O
  • 2016年07月01日 07:17
  • 49
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ASP.NET Web API 2 - 简单Unit Testing
举报原因:
原因补充:

(最多只允许输入30个字)