首页 > 解决方案 > 如何测试来自 URL 路由的参数是否正确绑定到对象?(C# 控制器)

问题描述

到目前为止,我尝试寻找答案,我发现的是与查询字符串相关的东西、自定义模型绑定器或与 viewbag 相关的东西(不相关)。对 C# 仍然很陌生,并且对它的内部工作方式不是很熟悉,所以我觉得我无法理解答案或将它们转化为这种情况。(像这样)有了这个问题,我希望找到一个带有评论或一些解释的答案。

情况:

我想测试模型绑定属性是否配置正确。主要动机是TDD,需要特定的配置并且需要测试驱动。另一个动机是,如果有人弄乱它并破坏它,测试会立即告诉你问题出在哪里。

具有单个端点的示例控制器(路由必须是这种方式):

    [ApiController]
    [Route("/cats")]
    public class CatsController : ControllerBase
    {
        [HttpGet]
        [Route("cat-breed/{cat_breed}/cat-size/{cat_size}")]
        public IActionResult GetMultipleCats([FromRoute] GetCatsRequestObject request)
        {
            //implementation is not important

            return Ok();
        }
    }

封装输入字段的请求对象(我们的标准之一):

    public class GetCatsRequestObject
    {
        [FromRoute(Name = "cat_breed")]   public string CatBreed { get; set; }
        [FromRoute(Name = "cat_size")]    public string CatSize { get; set; }
    }

我正在寻找的测试,我以某种方式使用 url 调用任何正在执行模型绑定的操作,然后在控制器中检查来自 url 的值是否 / 和我的请求中的正确位置对象。像这样的东西:

private CatsController _controllerUnderTest = new CatsController();

[Test]
public void GivenSomeUrl_WhenControllerIsCalledWithIt_ThenParametersFromUrlGetBindedCorrectly()
{
    //arrange
    string urlpart = "/cats/cat-breed/British%20Shorthair/cat-size/Medium%20Large";
    GetCatsRequestObject expectedResult = new GetCatsRequestObject() { CatBreed = "British Shorthair", CatSize = "Medium Large" };

    // The rest of the setup I don't know how to do

    //act
    // somehow do a call with the url, rather than request object.

    //assert
    // somehow capture the model binding result and compare it with expected result.
}

这可以测试吗?你会怎么做?我知道这是一篇很长的文章,所以我感谢你花时间阅读这篇文章。

标签: c#asp.netmodel-view-controllermodel-binding

解决方案


推荐阅读