c# route - 단위 테스트 Asp.Net WebApi:[FromUri]매개 변수를 사용하여 메서드의 올바른 라우팅을 테스트하는 방법




attribute config (4)

이 컨트롤러를 테스트하고 싶습니다.

[HttpGet]
public IList<Notification> GetNotificationsByCustomerAndId([FromUri] string[] name, [FromUri] int[] lastNotificationID)         
{
    return _storage.GetNotifications(name, lastNotificationID, _topX);
}

특히,이 방법에서는 배열에서 input으로 전달 된 요청을 URL, routeData.Values 와 동일한 배열로 routeData.Values 합니다. 단일 값 매개 변수 (배열 아님)의 경우 작동하지만 배열에서는 작동하지 않습니다. Values 디버그하면 controlleraction 만 표시됩니다.

[TestMethod]
public void GetNotificationsByCustomerAndId_ArrayOverload_Should_Match_InputParameter_name()
{
    string[] _testName = new string[] { _testCustomer, _testCustomerBis };

    string Url = string.Format(
           "http://www.testpincopallo.it/Notifications/GetByCustomerAndLastID/customersNotificationsInfos?name={0}&name={1}&lastNotificationID={2}&lastNotificationID={3}",
           _testName[0], _testName[1],
           _testNotificationID, _testNotificationIDBis);

    IHttpRouteData routeData = GetRouteData(Url);
    routeData.Values["name"].Should().Be(_testName);
}

배열을 전달하는 동안 단위 테스트를위한 또 다른 방법이 있습니까?


Answers

배열 항목에 대한 쿼리 문자열 매개 변수 목록을 만든 다음 &로 구분하여 String.Join 메서드를 사용하여 이들을 조인 할 수 있습니다. 이렇게하면 필요한 쿼리 문자열을 쉽게 얻을 수 있습니다.

[TestMethod]
        public void GetNotificationsByCustomerAndId_ArrayOverload_Should_Match_InputParameter_name()
        {
            string[] _testName = new string[] { _testCustomer, _testCustomerBis };

            // ASSUMING _testNotificationIDBis IS STRING ARRAY
            List<string> nParams = _testName.Select(n => string.Format("lastNotificationID={0}", n)).ToList<string>();
            string Url = string.Format(
               "http://www.testpincopallo.it/Notifications/GetByCustomerAndLastID/customersNotificationsInfos?name={0}&name={1}&{2}",
               _testName[0], _testName[1],
               String.Join("&", nParams.ToArray()));

            IHttpRouteData routeData = GetRouteData(Url);
            routeData.Values["name"].Should().Be(_testName);
        }

배열 요소의 수를 자동으로 결정하고 URL에 노출시키는 새로운 메서드를 만들어야한다고 생각합니다.

private static void ParameterSubstitution(string[] testName, string[] testNotification, ref string url)
{
    const string firstParametrName = "name";
    const string secondParametrName = "lastNotificationID";
    // first parametr
    url += string.Format("?{0}={1}", firstParametrName, string.Join(string.Format("&{0}=", firstParametrName), testName));
    // second parametr
    url += string.Format("&{0}={1}", secondParametrName, string.Join(string.Format("&{0}=",secondParametrName), testNotification));
}

다음과 같이 사용할 수 있습니다.

var testName = new[] { "Name1", "Name2"};
var testNotification = new[] { "Notification1", "Notification2", "Notification3" };

var Url =
    @"http://www.testpincopallo.it/Notifications/GetByCustomerAndLastID/customersNotificationsInfos";

ParameterSubstitution(testName, testNotification, ref Url);

아마도이 답변 에서처럼 string[] 아닌 List<string> 사용할 수 있습니까?

또한 쿼리 문자열에 name 대신 name[] 을 입력해야 할 수도 있습니다.

편집하다
이걸 살펴본 후, GetRouteData 호출 중에 단순하지 않은 유형의 모델 바인딩이 완료되지 않았는지 궁금해합니다. 결국 라우팅은 이러한 유형을 고려하지 않으며 예를 들어 다른 경로를 만들 수 없습니다. 건네받은 배열의 요소 수

따라서 요청 라우팅 대신 모델 바인딩을 조사해야합니다. 실제로 호출을 수행하지 않고 코드를 테스트하려면 ModelBinder 객체를 수동으로 검색하고 ModelBinder 사용하여 URL을 구문 분석 할 수 있습니다. ASP.NET 소스 코드의이 테스트는 관련성이 있습니다.


Visual Studio 2008에서 개인 메서드에 대한 테스트 메서드를 생성 할 수 있습니다. 개인 메서드에 대한 단위 테스트를 만들 때 테스트 참조 폴더가 테스트 프로젝트에 추가되고 해당 접근자가 해당 폴더에 추가됩니다. 액세서는 단위 테스트 메소드의 논리에서 참조됩니다. 이 접근자는 유닛 테스트가 테스트중인 코드에서 개인 메소드를 호출 할 수있게합니다. 자세한 내용은을 참조하십시오.

http://msdn.microsoft.com/en-us/library/bb385974.aspx





c# asp.net unit-testing asp.net-web-api