ASP.NET MVC 컨트롤러에 대한 단위 테스트 만들기
이 블로그 게시물에서는 뷰의 반환 유형, 다른 작업으로 리디렉션 등과 같은 다양한 MVC 컨트롤러의 동작에 대한 단위 테스트를 작성하는 방법을 배웁니다.
이 블로그 게시물에서는 뷰의 반환 유형, 다른 작업으로 리디렉션 등과 같은 다양한 MVC 컨트롤러의 동작에 대한 단위 테스트를 작성하는 방법을 배웁니다. 구체적으로 다음과 같은 단위 테스트를 작성하는 방법을 다룹니다.
- View컨트롤러의 데이터
- TempData of the Controller
- View컨트롤러의 가방
- 컨트롤러의 보기
Let’s get started!
테스트 중인 MVC 프로젝트 만들기
계속해서 테스트에서 MVC 프로젝트를 만들어 보겠습니다. 일을 더 간단하게 유지하기 위해 프로젝트에 대해 "인증 없음"을 선택했습니다. 이 예에서는 HomeController에 대한 단위 테스트를 작성할 것입니다. HomeController에는 두 가지 작업 메서드가 있습니다.
- 색인
- 세부
우리는 이러한 작업에 대한 테스트를 작성할 것입니다. HomeController에는 다음과 같은 코드가 포함되어 있습니다.
public class HomeController : Controller { public ActionResult Index() { return View("Index"); } public ActionResult Details(string Id) { //logic to fetch details on ID return View("Details"); } }
테스트 프로젝트 만들기
단위 테스트 프로젝트를 만들려면 솔루션을 마우스 오른쪽 단추로 클릭하고 새 프로젝트를 추가합니다. 새 프로젝트 추가 대화 상자의 아래 이미지와 같이 테스트 탭에서 단위 테스트 프로젝트 템플릿을 선택합니다.

MVC 프로젝트를 만드는 동안 확인란을 선택하여 테스트 프로젝트를 추가할 수도 있습니다. 테스트 프로젝트가 생성되면 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 MVC 프로젝트에 대한 참조를 추가합니다. 추가한 후 테스트 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 Nuget 패키지 관리를 선택하여 테스트 프로젝트에 System.Web.Mvc의 참조를 추가해야 합니다. Nuget 패키지 관리자에서 테스트 프로젝트에 Microsoft.AspNet.Mvc를 설치할 수 있습니다.

테스트 프로젝트를 설정하는 마지막 단계로 마우스 오른쪽 버튼을 클릭하고 HomeControllerTest라는 클래스를 추가합니다. 새로 생성된 클래스에서 아래 목록과 같이 샘플 테스트 메서드를 작성합니다.
public class HomeControllerTest { [TestMethod] public void SampleTest() { Assert.AreEqual("HomeController", "HomeController"); } }
이제 테스트 프로젝트를 빌드할 준비가 되었으며 빌드 오류가 발생하지 않습니다. 두 문자열을 비교하는 샘플 테스트 메서드를 작성했으며, 테스트를 실행하려면 아래 이미지와 같이 Test->Windows->Test Explorer를 선택하기만 하면 됩니다.

테스트 탐색기에서 SampleTest가 나열되어 있습니다. 테스트를 실행하려면 테스트를 마우스 오른쪽 단추로 클릭하고 실행을 선택하거나 테스트 맨 위에 있는 실행을 클릭합니다. 이 예에서는 SampleTest를 실행했습니다. 아래 이미지와 같이 테스트 탐색기에서 통과한 테스트를 볼 수 있습니다.

이제 HomeController 동작에 대한 테스트를 작성해 보겠습니다.
컨트롤러에서 반환된 테스트 보기
예상되는 뷰가 컨트롤러의 작업 메서드에 의해 반환되는지 여부를 확인하기 위해 test를 작성하고 실패할 테스트를 작성하는 것으로 시작하겠습니다.
[TestMethod] public void ReturnsDetailsView() { HomeController controllerUnderTest=new HomeController(); var result=controllerUnderTest.Details("a1") as ViewResult; Assert.AreEqual("fooview", result.ViewName); }
위의 테스트에서 볼 수 있듯이 HomeController의 개체에 대해 Details 작업을 호출하고 있습니다. Details 작업의 반환된 값은 ViewResult로 반환됩니다. 마지막 줄에서 우리는 retuned view의 이름이 fooview 와 같은지 여부를 주장하고 있습니다. 테스트를 실행하면 아래와 같은 오류가 발생합니다.

오류 메시지에서 분명히 알 수 있듯이 실제보기 이름은 세부 정보입니다. 그러니 돌아가서 통과할 테스트를 작성해 보겠습니다. 테스트를 통과하기 위해 예상 보기 이름을 세부 정보로 변경했습니다.
[TestMethod] public void ReturnsDetailsView() { HomeController controllerUnderTest=new HomeController(); var result=controllerUnderTest.Details("a1") as ViewResult; Assert.AreEqual("Details", result.ViewName); }
위의 테스트를 실행하면 통과됩니다.

컨트롤러에서 반환된 ViewBag 테스트
ViewBag, ViewData 및 TempData는 다음과 같이 한 컨트롤러에서 다른 컨트롤러로 또는 컨트롤러에서 뷰로 데이터를 전달하는 개체입니다.
- ViewBag은 컨트롤러에서 뷰로 데이터를 전달합니다.
- ViewData는 컨트롤러에서 뷰로 데이터를 전달합니다.
- TempData는 후속 HTTP 요청으로 데이터를 전달합니다.
컨트롤러에서 ViewBag은 아래 목록과 같이 설정할 수 있습니다.
public ActionResult Details(string Id) { ViewBag.Name="foo"; //logic to fetch details on ID return View("Details"); }
Details 작업에서 ViewBag에 대한 Name 속성을 만들고 해당 값을 string foo로 설정합니다. ViewBag을 테스트하기 위한 단위 테스트는 아래 목록과 같이 작성할 수 있습니다.
public void ReturnsViewBag() { HomeController controllerUnderTest=new HomeController(); var result=controllerUnderTest.Details("a1") as ViewResult; Assert.AreEqual("foo", result.ViewData["Name"]); }
간단히 말해서, 우리는 컨트롤러의 객체를 생성 한 다음 액션을 호출합니다. 반환 값을 ViewResult로 형식 변환한 다음 결과를 어설션합니다. 테스트를 실행하면 테스트가 통과되었고 컨트롤러가 예상 ViewBag을 반환하고 있음을 알 수 있습니다.

컨트롤러에서 반환된 ViewData 테스트
컨트롤러에서 ViewData는 아래 목록과 같이 설정할 수 있습니다.
public ActionResult Details(string Id) { ViewData["Name"]="foo"; //logic to fetch details on ID return View("Details"); }
Details 작업에서 ViewData를 만들고 해당 값을 string foo로 설정합니다. ViewData를 테스트하기 위한 단위 테스트는 아래 목록과 같이 작성할 수 있습니다.
public void ReturnsViewData() { HomeController controllerUnderTest=new HomeController(); var result=controllerUnderTest.Details("a1") as ViewResult; Assert.AreEqual("foo", result.ViewData["Name"]); }
간단히 말해서, 우리는 컨트롤러의 객체를 생성 한 다음 액션을 호출합니다. 반환 값을 ViewResult로 형식 변환한 다음 결과를 어설션합니다. 테스트를 실행하면 테스트가 통과되고 컨트롤러가 예상 ViewData를 반환하고 있음을 알 수 있습니다.

컨트롤러에서 반환된 TempData 테스트
TempData는 다음 HTTP 요청에 데이터를 전달하는 데 사용됩니다. 간단히 말해서 TempData를 사용하여 한 컨트롤러/작업에서 다른 컨트롤러/작업으로 데이터를 전달할 수 있습니다. 아래 목록과 같이 설정할 수 있습니다.
public ActionResult Details(string Id) { TempData["Name"]="foo"; //logic to fetch details on ID return RedirectToAction("Index"); }
Details 작업에서 TempData를 만들고, 해당 값을 foo 문자열로 설정하고, Index 작업으로 리디렉션합니다. TempData를 테스트하기 위한 단위 테스트는 다음과 같이 작성할 수 있습니다.
[TestMethod] public void ReturnsTempData() { HomeController controllerUnderTest=new HomeController(); var result=controllerUnderTest.Details("a1") as ViewResult; Assert.AreEqual("foo", result.TempData["Name"]); }
여기서는 컨트롤러의 개체를 만든 다음 작업을 호출합니다. 반환 값을 ViewResult로 형식변환한 다음 결과를 주장합니다. 테스트를 실행하면 테스트가 통과되고 컨트롤러가 예상 TempData를 반환하고 있음을 알 수 있습니다.

요약
다양한 컨트롤러의 객체에 대한 유닛 테스트를 작성하는 것은 항상 좋은 습관입니다. 이 게시물에서는 다음에 대한 단위 테스트를 작성하는 방법을 배웠습니다.
- View컨트롤러의 데이터
- TempData of the Controller
- View컨트롤러의 가방
- 컨트롤러의 보기
이 게시물이 도움이 되었기를 바라며 읽어 주셔서 감사합니다!