ProgramingTip

.NET 코어 MVC 컨트롤러의 단위 테스트를 위해 HttpContext를 모의 포장합니까?

bestdevel 2020. 11. 19. 21:51
반응형

.NET 코어 MVC 컨트롤러의 단위 테스트를 위해 HttpContext를 모의 포장합니까?


http 요청의 헤더에 값을 기대하는 단위 테스트 인 컨트롤러에 기능이 있습니다. 읽기 전용이기 때문에 HttpContext를 초기화 할 수 없습니다.

내 컨트롤러 함수에는 "device-id"에 대한 http 요청 헤더 값이 필요합니다.

[TestMethod]
public void TestValuesController()
{
    ValuesController controller = new ValuesController();

    //not valid controller.HttpContext is readonly
    //controller.HttpContext = new DefaultHttpContext(); 

    var result = controller.Get();
    Assert.AreEqual(result.Count(), 2);
}

보관 라이브러리를 사용하지 않고 수행하는 간단한 방법이 있습니까?


이 방법으로 httpcontext 및 헤더를 초기화 할 수 있습니다.

[TestMethod]
public void TestValuesController()
{
    ValuesController controller = new ValuesController();
    controller.ControllerContext = new ControllerContext();
    controller.ControllerContext.HttpContext = new DefaultHttpContext();
    controller.ControllerContext.HttpContext.Request.Headers["device-id"] = "20317";
    var result = controller.Get();
    //the controller correctly receives the http header key value pair device-id:20317
    ...
}

HTTPContext를 조롱하는 것보다 헤더를 전달하는 매개 변수에 매핑하는 것이 더 나은 생각 일 것입니다. 예를 들어이 답변의 맨 아래에있는 컨트롤러 에서 id매개 변수는 "device-id"와 같은 이름의 값 헤더로 설정됩니다. 그러면 단위 테스트는 다음과 같이됩니다.

[TestMethod]
public void TestValuesController()
{
    ValuesController controller = new ValuesController();
    var result = controller.GetHeaderValue("27");
    Assert.AreEqual(result, "27");
}

으로 HttpContext 조롱 수는 있지만 제 생각에는 선택의 여지가없는 한 피해야 할을 구석으로입니다. FromHeaderAttribute에 대한 설명서는 FromHeaderAttribute 클래스 에서 사용할 수 있습니다 .

    public class ValuesController: Controller
    {

      public string GetHeaderValue([FromHeader(Name = "device-id")] string id)
      {
        return id;
      }
    }

참고 URL : https://stackoverflow.com/questions/41400030/mock-httpcontext-for-unit-testing-a-net-core-mvc-controller

반응형