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


94

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);
}

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


1
HttpContext를 사용 하지 않습니까? 컨트롤러 사용의 요점은 데이터가 컨트롤러의 매개 변수를 통해 제공된다는 것입니다. 컨트롤러가 HttpContext를 사용하여 WebForms 페이지 인 것처럼 데이터를 읽는 경우 문제가 있습니다.
Panagiotis Kanavos

@PanagiotisKanavos 헤더의 값은 전화를 거는 모바일 장치를 나타내는 정보입니다. 이것은 올바른 데이터를 검색하는 데 필요합니다. 사용자 지정 작업 필터에 의해 처리되는 인증에 ID가 필요하기 때문에 장치 ID가 헤더에 있습니다. 나는 경로 매개 변수로 장치 ID를 전달할 수 수 있지만 중복 될 것이다
제임스 Wierzba

FromHeaderAttribute를 확인하고 중복도 확인하십시오. HttpContext를 지금 구성을 통해 주사입니다
파나지오티스 Kanavos

1
질문을 편집하여 원하는 것을 정확하게 지정하는 것이 좋습니다 (모바일 장치를 식별하기 위해 헤더 필드에 액세스). ASP.NET 문서는 문서 페이지가 누락 된 상태에서 친절하게 표현하기 위해 .... "전환"기간을 거치는 것 같습니다. 이 거의 동일한 질문을 확인하십시오.모바일 장치를 라우팅하는 방법을 묻는 을
Panagiotis

답변:


226

이 방법으로 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
    ...
}

21

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

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

HttpContext 조롱 할 있지만 제 생각에는 선택의 여지가없는 한 피해야 할 것입니다. FromHeaderAttribute에 대한 설명서는 여기에서 찾을 수 있습니다 . FromHeaderAttribute Class .

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

1
같은 값이 .NET의 핵심 미들웨어 구성 요소로 평가 될 필요가 있기 때문에 내 경우, IIRC, 그것은 HTTP 헤더에 포함하도록 요구했다
제임스 Wierzba
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.