具有属性的Web API操作的集成测试策略

时间:2017-04-17 20:04:05

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

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

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

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

CheckPermisision属性在内部使httpclient调用api以获取布尔值true或false,并在未经授权的情况下返回相应的状态代码。

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

1 个答案:

答案 0 :(得分: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