c# - webapi - routeprefix




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

배열 요소의 수를 자동으로 결정하고 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);

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

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

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


배열 항목에 대한 쿼리 문자열 매개 변수 목록을 만든 다음 &로 구분하여 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);
        }




asp.net-web-api