【问题标题】:Integration testing strategy for Web API actions with attributes具有属性的 Web API 操作的集成测试策略
【发布时间】:2017-04-17 20:04:05
【问题描述】:

我正在开发 ASP.NET Core WebApi。我们有用自定义属性装饰的操作方法。例如

[CheckPermission(Permissions.View)]
public IHttpActionResult Get()
{
}

CheckPermission 属性存在于共享库中,也将被其他 Api 使用。

CheckPermision 属性在内部使 httpclient 调用 api 以获取布尔值 true 或 false,如果未经授权则返回适当的状态代码。

我应该如何处理上述操作方法的集成测试。我正在使用内存测试服务器将我的 api 托管在内存中,然后我使用 xunit 在其上运行测试。我担心如果我也为权限设置数据,那么单元测试代码会变得非常混乱。

【问题讨论】:

    标签: c# asp.net-core integration-testing asp.net-core-webapi


    【解决方案1】:

    跳过任何授权管道的简单方法是将控制器视为正在测试的常规 C# 类。只需创建它并调用一个方法:

    var controller = new FooController();
    
    var result = await controller.Post(new PostData());
    

    如果控制器有外部依赖,事情会变得有点复杂:

    public class FooController : ApiController
    {
        public IStore Store { get; set; }
    
        public FooController(IStore store)
        {
            Store = store;
        }
    }
    

    您可以模拟一个依赖项(单元测试方式):

    var mock = new Mock<IStore>();
    var store = mock.Object;
    var controller = new FooController(store);
    

    或者,也可以使用 DI。在Startup.ConfigureServices 中注册所有依赖项和控制器本身。然后解析一个控制器实例:

    var services = new ServiceCollection();
    services.AddTransient<IStore, Store>();
    services.AddTransient<FooController>();
    var provider = services.BuildServiceProvider();
    
    var controller = provider.GetService<FooController>();
    

    您也可以注册假对象而不是真实对象。

    查看更多示例:Testing controllers

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-15
      • 1970-01-01
      • 1970-01-01
      • 2012-09-15
      • 2014-02-15
      • 1970-01-01
      • 2016-09-10
      • 2014-06-28
      相关资源
      最近更新 更多