【问题标题】:Unit testing a controller method with parameter validation单元测试具有参数验证的控制器方法
【发布时间】:2020-11-24 07:16:51
【问题描述】:

我希望为如下定义的控制器方法编写一个单元测试(实际的正则表达式要复杂得多,在这里进行了简化)

  [HttpGet, Route(@"/abc/{X}/{Y}")] /*,  
        public async Task<IActionResult> GetData(
            [FromRoute, Required, RegularExpression(@"^[\w]{4,12}$")]  string X,
            [FromRoute, Required, RegularExpression(@"^[\w]{2,24}$")]  string Y
            )
        {
             ... 
        }

现在,正如其他问题中所述,验证不适用于单元测试。但是,我希望有人可以阐明如何对使用顶级参数的代码进行单元测试,如上所示,因为到目前为止我发现的所有讨论都集中在模型验证上。

FWIW,我使用的是 Net 5。

【问题讨论】:

  • 不确定使用属性是否容易实现,但您可能对 Guard (github.com/safakgur/guard) 或 FluentValidation (fluentvalidation.net) 之类的库感兴趣。这些允许您保持验证规则易于编写和阅读,并将它们放在方法的主体中。

标签: c# .net asp.net-mvc asp.net-core-mvc .net-5


【解决方案1】:

我能够通过将测试提升为集成测试来实现这一点,将RefitIntegrationFixture 用作explained in this article on CodeProject

一般来说,它是这样的(如果链接失效,只需几个 sn-ps):

  1. 创建接口:
     public interface IMyAPI
        {
            [Get("/abc/{X},{Y}")]
            Task<ApiResponse<string>> Get( string X, string Y);
        }
  1. 在单元测试中使用它:
     using (var fixture = new RefitFixture<Startup, IMyAPI>(RestService.For<IMyAPI>))
            {
                var refitClient = fixture.GetRefitClient();
                var response = await refitClient.Get(X, Y);
                ...
             }

【讨论】:

    猜你喜欢
    • 2015-05-31
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多