在这篇文章中,我们将看到我们如何测试我们的API与一个叫包的帮助WebApiTestClient。大家都知道,如果你创建一个示例API项目,你会得到一个地区文件夹HelpPage。这是添加XML描述到每个控制器和行动,我们我们的API使用。如果你记录得很好,任何一个能理解你的API,这样你就不需要解释什么你的API会做,会产生什么输出。如果你是新来HelpPage实施API,请在这里看到:在网页API API帮助页面控制器操作说明。在这里,我要创建一个网页API在帮助页面描述的Visual Studio 2015年。之后一旦该项目已准备就绪,我将安装WebApiTestClient包我的解决方案。我希望你会喜欢这一点。
请注意,这个包没有正式Microsoft发布。这是创建一个原型姚- MSFT
下载源代码
你总是可以在这里下载源代码:API测试客户端
背景
在过去的几个月里,我一直在努力与API项目。最近,我被要求创建一个应用程序来测试我创造,使测试团队可以方便地测试API的API。是的,我同意,我们有像提琴手和邮递员为相同的工具。然而,我们认为,以创造我们自己的。当我开始我的发展,我才知道包WebApiTestClient它做什么我们想要的。最后,我们决定停止开发应用程序,并使用这个奇妙的包。在这里,我要告诉你我们如何能够利用这一点。
先决条件
- Visual Studio中的Web API安装
事情我们要做
以下是我们将要执行的任务。
- 建立数据库
- 创建实体框架
- 与创建的模型创建API控制器
- 安装WebApiTestClient
- 配置WebApiTestClient
- 测试WebApiTestClient
建立数据库
在这里,我要创造,我为我的演示目的创建的数据库,可以随时通过运行在这里提到的查询,创建这个数据库。
创建数据库

USE [master] GO /****** Object: Database [TrialsDB] Script Date: 5/12/2016 10:56:41 AM ******/ CREATE DATABASE [TrialsDB] CONTAINMENT = NONE ON PRIMARY ( NAME = N'TrialsDB', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\TrialsDB.mdf' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ) LOG ON ( NAME = N'TrialsDB_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\TrialsDB_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%) GO ALTER DATABASE [TrialsDB] SET COMPATIBILITY_LEVEL = 110 GO IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')) begin EXEC [TrialsDB].[dbo].[sp_fulltext_database] @action = 'enable' end GO ALTER DATABASE [TrialsDB] SET ANSI_NULL_DEFAULT OFF GO ALTER DATABASE [TrialsDB] SET ANSI_NULLS OFF GO ALTER DATABASE [TrialsDB] SET ANSI_PADDING OFF GO ALTER DATABASE [TrialsDB] SET ANSI_WARNINGS OFF GO ALTER DATABASE [TrialsDB] SET ARITHABORT OFF GO ALTER DATABASE [TrialsDB] SET AUTO_CLOSE OFF GO ALTER DATABASE [TrialsDB] SET AUTO_CREATE_STATISTICS ON GO ALTER DATABASE [TrialsDB] SET AUTO_SHRINK OFF GO ALTER DATABASE [TrialsDB] SET AUTO_UPDATE_STATISTICS ON GO ALTER DATABASE [TrialsDB] SET CURSOR_CLOSE_ON_COMMIT OFF GO ALTER DATABASE [TrialsDB] SET CURSOR_DEFAULT GLOBAL GO ALTER DATABASE [TrialsDB] SET CONCAT_NULL_YIELDS_NULL OFF GO ALTER DATABASE [TrialsDB] SET NUMERIC_ROUNDABORT OFF GO ALTER DATABASE [TrialsDB] SET QUOTED_IDENTIFIER OFF GO ALTER DATABASE [TrialsDB] SET RECURSIVE_TRIGGERS OFF GO ALTER DATABASE [TrialsDB] SET DISABLE_BROKER GO ALTER DATABASE [TrialsDB] SET AUTO_UPDATE_STATISTICS_ASYNC OFF GO ALTER DATABASE [TrialsDB] SET DATE_CORRELATION_OPTIMIZATION OFF GO ALTER DATABASE [TrialsDB] SET TRUSTWORTHY OFF GO ALTER DATABASE [TrialsDB] SET ALLOW_SNAPSHOT_ISOLATION OFF GO ALTER DATABASE [TrialsDB] SET PARAMETERIZATION SIMPLE GO ALTER DATABASE [TrialsDB] SET READ_COMMITTED_SNAPSHOT OFF GO ALTER DATABASE [TrialsDB] SET HONOR_BROKER_PRIORITY OFF GO ALTER DATABASE [TrialsDB] SET RECOVERY FULL GO ALTER DATABASE [TrialsDB] SET MULTI_USER GO ALTER DATABASE [TrialsDB] SET PAGE_VERIFY CHECKSUM GO ALTER DATABASE [TrialsDB] SET DB_CHAINING OFF GO ALTER DATABASE [TrialsDB] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF ) GO ALTER DATABASE [TrialsDB] SET TARGET_RECOVERY_TIME = 0 SECONDS GO ALTER DATABASE [TrialsDB] SET READ_WRITE GO
创建数据表

USE [TrialsDB] GO /****** Object: Table [dbo].[Product] Script Date: 5/12/2016 10:54:48 AM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Product]( [ProductID] [int] NOT NULL, [Name] [nvarchar](max) NOT NULL, [ProductNumber] [nvarchar](25) NOT NULL, [MakeFlag] [bit] NOT NULL, [FinishedGoodsFlag] [bit] NOT NULL, [Color] [nvarchar](15) NULL, [SafetyStockLevel] [smallint] NOT NULL, [ReorderPoint] [smallint] NOT NULL, [StandardCost] [money] NOT NULL, [ListPrice] [money] NOT NULL, [Size] [nvarchar](5) NULL, [SizeUnitMeasureCode] [nchar](3) NULL, [WeightUnitMeasureCode] [nchar](3) NULL, [Weight] [decimal](8, 2) NULL, [DaysToManufacture] [int] NOT NULL, [ProductLine] [nchar](2) NULL, [Class] [nchar](2) NULL, [Style] [nchar](2) NULL, [ProductSubcategoryID] [int] NULL, [ProductModelID] [int] NULL, [SellStartDate] [datetime] NOT NULL, [SellEndDate] [datetime] NULL, [DiscontinuedDate] [datetime] NULL, [rowguid] [uniqueidentifier] ROWGUIDCOL NOT NULL, [ModifiedDate] [datetime] NOT NULL ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO INSERT [dbo].[Product] ([ProductID], [Name], [ProductNumber], [MakeFlag], [FinishedGoodsFlag], [Color], [SafetyStockLevel], [ReorderPoint], [StandardCost], [ListPrice], [Size], [SizeUnitMeasureCode], [WeightUnitMeasureCode], [Weight], [DaysToManufacture], [ProductLine], [Class], [Style], [ProductSubcategoryID], [ProductModelID], [SellStartDate], [SellEndDate], [DiscontinuedDate], [rowguid], [ModifiedDate]) VALUES (1, N'Adjustable Race', N'AR-5381', 0, 0, NULL, 1000, 750, 0.0000, 0.0000, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, CAST(0x0000921E00000000 AS DateTime), NULL, NULL, N'694215b7-08f7-4c0d-acb1-d734ba44c0c8', CAST(0x00009A5C00A53CF8 AS DateTime)) INSERT [dbo].[Product] ([ProductID], [Name], [ProductNumber], [MakeFlag], [FinishedGoodsFlag], [Color], [SafetyStockLevel], [ReorderPoint], [StandardCost], [ListPrice], [Size], [SizeUnitMeasureCode], [WeightUnitMeasureCode], [Weight], [DaysToManufacture], [ProductLine], [Class], [Style], [ProductSubcategoryID], [ProductModelID], [SellStartDate], [SellEndDate], [DiscontinuedDate], [rowguid], [ModifiedDate]) VALUES (2, N'Bearing Ball', N'BA-8327', 0, 0, NULL, 1000, 750, 0.0000, 0.0000, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, CAST(0x0000921E00000000 AS DateTime), NULL, NULL, N'58ae3c20-4f3a-4749-a7d4-d568806cc537', CAST(0x00009A5C00A53CF8 AS DateTime)) INSERT [dbo].[Product] ([ProductID], [Name], [ProductNumber], [MakeFlag], [FinishedGoodsFlag], [Color], [SafetyStockLevel], [ReorderPoint], [StandardCost], [ListPrice], [Size], [SizeUnitMeasureCode], [WeightUnitMeasureCode], [Weight], [DaysToManufacture], [ProductLine], [Class], [Style], [ProductSubcategoryID], [ProductModelID], [SellStartDate], [SellEndDate], [DiscontinuedDate], [rowguid], [ModifiedDate]) VALUES (3, N'BB Ball Bearing', N'BE-2349', 1, 0, NULL, 800, 600, 0.0000, 0.0000, NULL, NULL, NULL, NULL, 1, NULL, NULL, NULL, NULL, NULL, CAST(0x0000921E00000000 AS DateTime), NULL, NULL, N'9c21aed2-5bfa-4f18-bcb8-f11638dc2e4e', CAST(0x00009A5C00A53CF8 AS DateTime)) INSERT [dbo].[Product] ([ProductID], [Name], [ProductNumber], [MakeFlag], [FinishedGoodsFlag], [Color], [SafetyStockLevel], [ReorderPoint], [StandardCost], [ListPrice], [Size], [SizeUnitMeasureCode], [WeightUnitMeasureCode], [Weight], [DaysToManufacture], [ProductLine], [Class], [Style], [ProductSubcategoryID], [ProductModelID], [SellStartDate], [SellEndDate], [DiscontinuedDate], [rowguid], [ModifiedDate]) VALUES (4, N'Headset Ball Bearings', N'BE-2908', 0, 0, NULL, 800, 600, 0.0000, 0.0000, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, CAST(0x0000921E00000000 AS DateTime), NULL, NULL, N'ecfed6cb-51ff-49b5-b06c-7d8ac834db8b', CAST(0x00009A5C00A53CF8 AS DateTime)) INSERT [dbo].[Product] ([ProductID], [Name], [ProductNumber], [MakeFlag], [FinishedGoodsFlag], [Color], [SafetyStockLevel], [ReorderPoint], [StandardCost], [ListPrice], [Size], [SizeUnitMeasureCode], [WeightUnitMeasureCode], [Weight], [DaysToManufacture], [ProductLine], [Class], [Style], [ProductSubcategoryID], [ProductModelID], [SellStartDate], [SellEndDate], [DiscontinuedDate], [rowguid], [ModifiedDate]) VALUES (316, N'Blade', N'BL-2036', 1, 0, NULL, 800, 600, 0.0000, 0.0000, NULL, NULL, NULL, NULL, 1, NULL, NULL, NULL, NULL, NULL, CAST(0x0000921E00000000 AS DateTime), NULL, NULL, N'e73e9750-603b-4131-89f5-3dd15ed5ff80', CAST(0x00009A5C00A53CF8 AS DateTime)) INSERT [dbo].[Product] ([ProductID], [Name], [ProductNumber], [MakeFlag], [FinishedGoodsFlag], [Color], [SafetyStockLevel], [ReorderPoint], [StandardCost], [ListPrice], [Size], [SizeUnitMeasureCode], [WeightUnitMeasureCode], [Weight], [DaysToManufacture], [ProductLine], [Class], [Style], [ProductSubcategoryID], [ProductModelID], [SellStartDate], [SellEndDate], [DiscontinuedDate], [rowguid], [ModifiedDate]) VALUES (317, N'LL Crankarm', N'CA-5965', 0, 0, N'Black', 500, 375, 0.0000, 0.0000, NULL, NULL, NULL, NULL, 0, NULL, N'L ', NULL, NULL, NULL, CAST(0x0000921E00000000 AS DateTime), NULL, NULL, N'3c9d10b7-a6b2-4774-9963-c19dcee72fea', CAST(0x00009A5C00A53CF8 AS DateTime)) INSERT [dbo].[Product] ([ProductID], [Name], [ProductNumber], [MakeFlag], [FinishedGoodsFlag], [Color], [SafetyStockLevel], [ReorderPoint], [StandardCost], [ListPrice], [Size], [SizeUnitMeasureCode], [WeightUnitMeasureCode], [Weight], [DaysToManufacture], [ProductLine], [Class], [Style], [ProductSubcategoryID], [ProductModelID], [SellStartDate], [SellEndDate], [DiscontinuedDate], [rowguid], [ModifiedDate]) VALUES (318, N'ML Crankarm', N'CA-6738', 0, 0, N'Black', 500, 375, 0.0000, 0.0000, NULL, NULL, NULL, NULL, 0, NULL, N'M ', NULL, NULL, NULL, CAST(0x0000921E00000000 AS DateTime), NULL, NULL, N'eabb9a92-fa07-4eab-8955-f0517b4a4ca7', CAST(0x00009A5C00A53CF8 AS DateTime))
我们的数据库已经准备就绪,现在就创建在Visual Studio中,并与上述数据库的Web API应用程序,然后实体。

创建实体
如果你不知道如何创建解决方案中的一个实体,请阅读这里。我刚才提到要遵循该文章中的步骤。一旦你创建了实体,你是好去创造与创造的实体API控制器。如果你这样做,CRUD操作将自动为您创建。您可能需要根据自己的需要来编辑这些行动。

网页API 2控制器的操作,使用实体框架
选择模型类,那么的DbContext命名您的控制器,然后单击确定。我希望能与CRUD操作的控制器。现在,我们可以修改如下。

using System; using System.Collections.Generic; using System.Data; using System.Data.Entity; using System.Data.Entity.Infrastructure; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; using System.Web.Http.Description; using ControllerActionDescriptions.Models; namespace ControllerActionDescriptions.Controllers { public class ProductsController : ApiController { private TrialsDBEntities db = new TrialsDBEntities(); #region GetProducts /// <summary> /// Get all the products available /// GET: api/Products /// </summary> public IQueryable<Product> GetProducts() { return db.Products; } #endregion #region GetProductWithParameter /// <summary> /// Get a single product by id /// GET: api/Products/5 /// <param name="id"></param> /// </summary> [ResponseType(typeof(Product))] public IHttpActionResult GetProduct(int id) { Product product = db.Products.Find(id); if (product == null) { return NotFound(); } return Ok(product); } #endregion // PUT: api/Products/5 [ResponseType(typeof(void))] public IHttpActionResult PutProduct(int id, Product product) { if (!ModelState.IsValid) { return BadRequest(ModelState); } if (id != product.ProductID) { return BadRequest(); } db.Entry(product).State = EntityState.Modified; try { db.SaveChanges(); } catch (DbUpdateConcurrencyException) { if (!ProductExists(id)) { return NotFound(); } else { throw; } } return StatusCode(HttpStatusCode.NoContent); } // POST: api/Products [ResponseType(typeof(Product))] public IHttpActionResult PostProduct(Product product) { if (!ModelState.IsValid) { return BadRequest(ModelState); } db.Products.Add(product); try { db.SaveChanges(); } catch (DbUpdateException) { if (ProductExists(product.ProductID)) { return Conflict(); } else { throw; } } return CreatedAtRoute("DefaultApi", new { id = product.ProductID }, product); } // DELETE: api/Products/5 [ResponseType(typeof(Product))] public IHttpActionResult DeleteProduct(int id) { Product product = db.Products.Find(id); if (product == null) { return NotFound(); } db.Products.Remove(product); db.SaveChanges(); return Ok(product); } protected override void Dispose(bool disposing) { if (disposing) { db.Dispose(); } base.Dispose(disposing); } private bool ProductExists(int id) { return db.Products.Count(e => e.ProductID == id) > 0; } } }
安装WebApiTestClient
要安装该软件包,请到您的套餐的NuGet软件包管理器管理控制台并运行以下命令。
Install-Package WebApiTestClient
你总是可以得到有关包的细节在这里。
一旦你安装包,你可以看到一些文件添加到您的脚本和地区的文件夹前面。

脚本和文件夹区
配置WebApiTestClient
要配置WebApiTestClient,请访问该文件夹Areas->视图 - >帮助,然后点击Api.cshtml

API CSHTML
这是当你点击你的帮助页面每个API显示的视图。现在添加前面的代码块这一观点。
@Html.DisplayForModel("TestClientDialogs") @section Scripts { <link href="~/Areas/HelpPage/HelpPage.css" rel="stylesheet" type="text/css" /> @Html.DisplayForModel("TestClientReferences") }

代码块
测试WebApiTestClient
现在运行您的API应用程序并进入帮助页面任何控制器动作,你可以看到底部的按钮称为测试API。如果你点击,你会得到一个弹出,你可以测试你的API的行动。

测试API客户端输出
现在,如果通过单击发送按钮发送您的要求,您会得到如下的输出。

测试API客户端输出与响应之间的
你可以随时给id参数如下。

测试客户端有了参数
你也可以给内容长度和内容类型在您的文章要求如下。

测试客户端后用

测试客户端使用PUT请求
参考
- 样品测试客户端
- WebApiTestClient
作者已经张贴在GitHub上的源代码,请查看这里。
有一个幸福的编码!
结论
我错过了什么,你可能会认为这是需要的?你会发现这个岗位作为有用吗?我希望你喜欢这篇文章。请分享你我的宝贵建议和反馈。
到你了。你怎么看?
博客是不是没有评论的博客,但会尽力留在话题。如果你有不相关的这个职位的问题,你就要去张贴在C#角,代码项目,堆栈溢出,Asp.Net论坛,而不是在这里评论更好。鸣叫或发邮件给我一个链接到你的问题有,我一定会尽力帮助如果我能。
最亲切的问候
Sibeesh VENU