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,查看覆盖率







《Asp.Net Web API》-----webApi的简单使用

前言:在公司工作的时候,经理跟我说我们后台用的是WebApi技术,说它是一种轻量级的WCF,我以前用过WCF,但是对于WebApi有点不熟悉,但是经理说和WCF相似,我渐渐的对着门技术变得渐渐的好奇起...

ASP.NET Web API(C#)实现简单增删改查

web Api

使用OWIN 构建自宿主ASP.NET Web API 2

ASP.NET Web API 2拥有符合RESTFUL风格,原生支持HTML协议,解耦IIS和windows server服务器等诸多优秀特性。本文讲述如何使用OWIN构建ASP.NET Web A...

ASP.NET Web API2 Introduction

应用程序通信一直是架构设计方面的终点,微软从DCOM到.NET Remoting,再到WCF,一致致力于提供统一,规范的通信编程模式。WCF作为重量级的通信框架,一时间成为了SOA和WebServic...

ASP.NET Web API 2 入门教程

译者:jiankunking 出处:http://blog.csdn.net/jiankunking 源码下载HTTP不仅提供web页面服务,在构建公开服务和数据api方面,它也是一个强大的平台。HT...

支持Ajax跨域访问ASP.NET Web Api 2(Cors)的示例

随着深入使用ASP.NET Web Api,我们可能会在项目中考虑将前端的业务分得更细。比如前端项目使用Angularjs的框架来做UI,而数据则由另一个Web Api 的网站项目来支撑。注意,这里是...
  • hoiven
  • hoiven
  • 2016年05月10日 14:24
  • 1540

(待翻译)Authentication Filters in ASP.NET Web API 2

An authentication filter is a component that authenticates an HTTP request. Web API 2 and MVC 5 both...

使用angular4和asp.net core 2 web api做个练习项目(二), 这部分都是angular

import { Injectable } from '@angular/core'; import { Http, Headers } from '@angular/http'; import { ...

ASP.NET4.5Web API及非同步程序开发系列(2)

认识ASP.NET WEB API 他的前身为WCF WEB API用于协助WCF支持RestFul。现在集成进ASP.NET,正式更名为ASP.NET WEB API,ASP.NET Web AP...

ASP.NET MVC4 WEB API入门 第二篇:ASP.NET MVC入门基础(2)—— 简单登录功能的实现

在上一章博客已经简单的介绍了ASP .NET MVC的基本功能以及项目架构的简单搭建,这一章主要是简单的实现登录的业务逻辑,从而实现登录的功能。 接下来通过实现简单的登录业务逻辑,以及前端页面,来简单...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ASP.NET Web API 2 - 简单Unit Testing
举报原因:
原因补充:

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