单元测试Asp.Net WebApi:如何用[FromUri]参数测试方法的正确路由?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (120)

我想测试这个控制器:

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

特别是,在这个方法中,我想测试一下数组传入输入以形成请求Url,与进入的数组是相同的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);
}

在传递数组时,是否有其他方法进行单元测试?

提问于
用户回答回答于

也许你可以使用List<string>而不是string[]

此外,可能需要投入name[],而不是name在查询字符串。 看看这个之后,我想知道在GetRouteData调用期间是否没有完成非简单类型的模型绑定- 毕竟,路由不考虑这些类型,并且您不能创建两个不同的路由,例如,传递数组中元素的数量。

所以你应该考虑模型绑定而不是请求路由。要在没有实际执行调用的情况下测试代码,可以ModelBinder手动检索对象并使用它来分析URL。这个来自ASP.NET源代码的测试可能有关。

用户回答回答于

我认为你应该创建一个新的方法来自动确定数组元素的数量并将它们暴露给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);

扫码关注云+社区

领取腾讯云代金券