단위 테스트 ASP.NET Web API 2Unit Testing ASP.NET Web API 2

Tom FitzMackenby Tom FitzMacken

완료 된 프로젝트 다운로드Download Completed Project

이 지침과 응용 프로그램에는 Web API 2 응용 프로그램에 대 한 간단한 단위 테스트를 만드는 방법을 보여 줍니다.This guidance and application demonstrate how to create simple unit tests for your Web API 2 application. 이 자습서에서는 솔루션에 단위 테스트 프로젝트를 포함 하 고 컨트롤러 메서드에서 반환된 된 값을 확인 하는 테스트 메서드를 작성 하는 방법을 보여 줍니다.This tutorial shows how to include a unit test project in your solution, and write test methods that check the returned values from a controller method.

이 자습서에서는 ASP.NET Web API의 기본 개념에 익숙하다고 가정 합니다.This tutorial assumes you are familiar with the basic concepts of ASP.NET Web API. 입문 용 자습서는를 참조 하세요 ASP.NET Web API 2 시작합니다.For an introductory tutorial, see Getting Started with ASP.NET Web API 2.

이 항목의 단위 테스트를 간단한 데이터 시나리오를 의도적으로 제한 됩니다.The unit tests in this topic are intentionally limited to simple data scenarios. 고급 데이터 시나리오를 테스트 하는 장치에 대 한 참조 Entity Framework 머킹 때 단위 테스트 ASP.NET Web API 2합니다.For unit testing more advanced data scenarios, see Mocking Entity Framework when Unit Testing ASP.NET Web API 2.

이 자습서에 사용 되는 소프트웨어 버전Software versions used in the tutorial

항목 내용In this topic

이 항목에는 다음과 같은 단원이 포함되어 있습니다.This topic contains the following sections:

전제 조건Prerequisites

Visual Studio 2017 Community, Professional 또는 Enterprise editionVisual Studio 2017 Community, Professional or Enterprise edition

코드 다운로드Download code

다운로드 합니다 완성 된 프로젝트합니다.Download the completed project. 다운로드 가능한 프로젝트 및이 항목에 대 한 단위 테스트 코드를 포함 합니다 Entity Framework 머킹 때 단위 테스트 ASP.NET Web API 항목입니다.The downloadable project includes unit test code for this topic and for the Mocking Entity Framework when Unit Testing ASP.NET Web API topic.

단위 테스트 프로젝트를 사용 하 여 응용 프로그램 만들기Create application with unit test project

응용 프로그램을 만들 때 단위 테스트 프로젝트 만들기 또는 기존 응용 프로그램에 단위 테스트 프로젝트를 추가 합니다.You can either create a unit test project when creating your application or add a unit test project to an existing application. 이 자습서에는 단위 테스트 프로젝트를 만드는 방법을 모두 보여 줍니다.This tutorial shows both methods for creating a unit test project. 이 자습서를 수행 하려면 방법 중 하나를 사용할 수 있습니다.To follow this tutorial, you can use either approach.

응용 프로그램을 만들 때 단위 테스트 프로젝트 추가Add unit test project when creating the application

명명 된 새 ASP.NET 웹 응용 프로그램 만들기 StoreApp합니다.Create a new ASP.NET Web Application named StoreApp.

프로젝트 만들기

새 ASP.NET 프로젝트 창에서 선택 합니다 템플릿 폴더를 추가 하 고 웹 API에 대 한 참조를 핵심입니다.In the New ASP.NET Project windows, select the Empty template and add folders and core references for Web API. 선택 된 단위 테스트 추가 옵션입니다.Select the Add unit tests option. 단위 테스트 프로젝트 이름은 자동으로 StoreApp.Tests합니다.The unit test project is automatically named StoreApp.Tests. 이 이름을 유지할 수 있습니다.You can keep this name.

단위 테스트 프로젝트 만들기

응용 프로그램을 만든 후 두 개의 프로젝트가 포함 된 표시 됩니다.After creating the application, you will see it contains two projects.

두 프로젝트

기존 응용 프로그램에 단위 테스트 프로젝트 추가Add unit test project to an existing application

응용 프로그램을 만들 때에 단위 테스트 프로젝트를 만들지 않은, 경우 언제 든 지 추가할 수 있습니다.If you did not create the unit test project when you created your application, you can add one at any time. 예를 들어 이미 StoreApp, 명명 된 응용 프로그램 및 단위 테스트를 추가.For example, suppose you already have an application named StoreApp, and you want to add unit tests. 단위 테스트 프로젝트를 추가 하려면 솔루션을 마우스 오른쪽 단추로 클릭 하 고 선택 추가 하 고 새 프로젝트합니다.To add a unit test project, right-click your solution and select Add and New Project.

솔루션에 새 프로젝트 추가

선택 테스트 선택한 왼쪽된 창의 단위 테스트 프로젝트 프로젝트 형식에 대 한 합니다.Select Test in the left pane, and select Unit Test Project for the project type. 프로젝트 이름을 StoreApp.Tests합니다.Name the project StoreApp.Tests.

단위 테스트 프로젝트 추가

솔루션에 단위 테스트 프로젝트가 표시 됩니다.You will see the unit test project in your solution.

단위 테스트 프로젝트에서 원래 프로젝트에 대 한 프로젝트 참조를 추가 합니다.In the unit test project, add a project reference to the original project.

Web API 2 응용 프로그램 설정Set up the Web API 2 application

StoreApp 프로젝트에서 클래스 파일을 추가 합니다 모델 폴더가 Product.cs합니다.In your StoreApp project, add a class file to the Models folder named Product.cs. 파일의 내용을 다음 코드로 바꿉니다.Replace the contents of the file with the following code.

using System;

namespace StoreApp.Models
{
    public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public decimal Price { get; set; }
    }
}

솔루션을 빌드합니다.Build the solution.

컨트롤러 폴더를 마우스 오른쪽 단추로 누르고 추가 하 고 새 스 캐 폴드 된 항목합니다.Right-click the Controllers folder and select Add and New Scaffolded Item. 선택 Web API 2 컨트롤러-비어 있음을합니다.Select Web API 2 Controller - Empty.

새 컨트롤러 추가

컨트롤러 이름으로 설정할 SimpleProductController, 클릭 추가합니다.Set the controller name to SimpleProductController, and click Add.

컨트롤러를 지정 합니다.

기존 코드를 다음 코드로 바꿉니다.Replace the existing code with the following code. 를 간소화 하기 위해이 예제 데이터는 데이터베이스 보다는 목록에 저장 됩니다.To simplify this example, the data is stored in a list rather than a database. 이 클래스에 정의 된 목록에는 프로덕션 데이터를 나타냅니다.The list defined in this class represents the production data. 컨트롤러 제품 개체의 목록이 매개 변수로 사용 하는 생성자에 포함 되어 있는지 확인 합니다.Notice that the controller includes a constructor that takes as a parameter a list of Product objects. 이 생성자를 사용 하면 테스트 데이터를 전달할 때 단위 테스트 합니다.This constructor enables you to pass test data when unit testing. 컨트롤러는 또한 두 개의 비동기 비동기 메서드를 테스트 하는 단위를 설명 하는 방법입니다.The controller also includes two async methods to illustrate unit testing asynchronous methods. 이러한 비동기 메서드를 호출 하 여 구현한 Task.FromResult 불필요 한 코드 이지만, 일반적으로 메서드를 최소화 하기 위해 리소스 집약적 작업이 포함 됩니다.These async methods were implemented by calling Task.FromResult to minimize extraneous code, but normally the methods would include resource-intensive operations.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web.Http;
using StoreApp.Models;

namespace StoreApp.Controllers
{
    public class SimpleProductController : ApiController
    {
        List<Product> products = new List<Product>();        
           
        public SimpleProductController() { }

        public SimpleProductController(List<Product> products)
        {
            this.products = products;
        }

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

        public async Task<IEnumerable<Product>> GetAllProductsAsync()
        {
            return await Task.FromResult(GetAllProducts());
        }

        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)
        {
            return await Task.FromResult(GetProduct(id));
        }
    }
}

GetProduct 메서드의 인스턴스를 반환 합니다 IHttpActionResult 인터페이스입니다.The GetProduct method returns an instance of the IHttpActionResult interface. IHttpActionResult을 사용 하면 Web API 2의 새로운 기능 중 하나인 및 단위 테스트 개발을 간소화 합니다.IHttpActionResult is one of the new features in Web API 2, and it simplifies unit test development. IHttpActionResult 인터페이스를 구현 하는 클래스에서 발견 되는 System.Web.Http.Results 네임 스페이스입니다.Classes that implement the IHttpActionResult interface are found in the System.Web.Http.Results namespace. 이러한 클래스는 작업 요청 으로부터 가능한 응답 나타내고 HTTP 상태 코드에 해당 합니다.These classes represent possible responses from an action request, and they correspond to HTTP status codes.

솔루션을 빌드합니다.Build the solution.

이제 테스트 프로젝트를 설정할 준비가 되었습니다.You are now ready to set up the test project.

테스트 프로젝트에서 NuGet 패키지를 설치 합니다.Install NuGet packages in test project

빈 템플릿을 사용 하 여 응용 프로그램을 만들 때 단위 테스트 프로젝트 (StoreApp.Tests)는 설치 된 모든 NuGet 패키지를 포함 하지 않습니다.When you use the Empty template to create an application, the unit test project (StoreApp.Tests) does not include any installed NuGet packages. Web API 템플릿과 같은 다른 템플릿을 단위 테스트 프로젝트에 일부 NuGet 패키지를 포함합니다.Other templates, such as the Web API template, include some NuGet packages in the unit test project. 이 자습서에서는 Microsoft ASP.NET 웹 API 2 코어 패키지를 테스트 프로젝트를 포함 해야 합니다.For this tutorial, you must include the Microsoft ASP.NET Web API 2 Core package to the test project.

StoreApp.Tests 프로젝트를 마우스 오른쪽 단추로 누르고 NuGet 패키지 관리합니다.Right-click the StoreApp.Tests project and select Manage NuGet Packages. 해당 프로젝트에 패키지를 추가 하려면 StoreApp.Tests 프로젝트를 선택 해야 합니다.You must select the StoreApp.Tests project to add the packages to that project.

패키지 관리

찾기 및 Microsoft ASP.NET 웹 API 2 코어 패키지를 설치 합니다.Find and install Microsoft ASP.NET Web API 2 Core package.

웹 api core 패키지를 설치 합니다.

NuGet 패키지 관리 창을 닫습니다.Close the Manage NuGet Packages window.

테스트 만들기Create tests

테스트 프로젝트는 기본적으로 UnitTest1.cs 이라는 빈 테스트 파일을 포함 합니다.By default, your test project includes an empty test file named UnitTest1.cs. 이 파일을 사용 하면 테스트 메서드를 만들 특성을 보여 줍니다.This file shows the attributes you use to create test methods. 단위 테스트에 대 한이 파일을 사용 하거나 사용자 고유의 파일을 만듭니다.For your unit tests, you can either use this file or create your own file.

UnitTest1

이 자습서에서는 사용자 고유의 테스트 클래스를 만듭니다.For this tutorial, you will create your own test class. UnitTest1.cs 파일을 삭제할 수 있습니다.You can delete the UnitTest1.cs file. 라는 클래스를 추가 TestSimpleProductController.cs, 코드를 다음 코드로 바꿉니다.Add a class named TestSimpleProductController.cs, and replace the code with the following code.

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Web.Http.Results;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using StoreApp.Controllers;
using StoreApp.Models;

namespace StoreApp.Tests
{
    [TestClass]
    public class TestSimpleProductController
    {
        [TestMethod]
        public void GetAllProducts_ShouldReturnAllProducts()
        {
            var testProducts = GetTestProducts();
            var controller = new SimpleProductController(testProducts);

            var result = controller.GetAllProducts() as List<Product>;
            Assert.AreEqual(testProducts.Count, result.Count);
        }

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

            var result = await controller.GetAllProductsAsync() as List<Product>;
            Assert.AreEqual(testProducts.Count, result.Count);
        }

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

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

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

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

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

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

        private List<Product> GetTestProducts()
        {
            var testProducts = new List<Product>();
            testProducts.Add(new Product { Id = 1, Name = "Demo1", Price = 1 });
            testProducts.Add(new Product { Id = 2, Name = "Demo2", Price = 3.75M });
            testProducts.Add(new Product { Id = 3, Name = "Demo3", Price = 16.99M });
            testProducts.Add(new Product { Id = 4, Name = "Demo4", Price = 11.00M });

            return testProducts;
        }
    }
}

테스트 실행Run tests

이제 테스트를 실행할 준비가 되었습니다.You are now ready to run the tests. 로 표시 되는 메서드의 모든 합니다 TestMethod 특성을 테스트 합니다.All of the method that are marked with the TestMethod attribute will be tested. 테스트 메뉴 항목, 테스트를 실행 합니다.From the Test menu item, run the tests.

테스트 실행

열기는 테스트 탐색기 창 테스트의 결과 확인 합니다.Open the Test Explorer window, and notice the results of the tests.

테스트 결과

요약Summary

이 자습서를 완료 했습니다.You have completed this tutorial. 이 자습서의 데이터는 단위 테스트 조건에 초점을 맞춰 의도적으로 단순화 되었습니다.The data in this tutorial was intentionally simplified to focus on unit testing conditions. 고급 데이터 시나리오를 테스트 하는 장치에 대 한 참조 Entity Framework 머킹 때 단위 테스트 ASP.NET Web API 2합니다.For unit testing more advanced data scenarios, see Mocking Entity Framework when Unit Testing ASP.NET Web API 2.