我正在使用ASP.NET Core WebApi。我们有使用自定义属性修饰的操作方法。例如
[CheckPermission(Permissions.View)]
public IHttpActionResult Get()
{
}
CheckPermission属性存在于共享库中,也将被其他Api使用。
CheckPermisision属性在内部使httpclient调用api以获取布尔值true或false,并在未经授权的情况下返回相应的状态代码。
我应该如何处理上述操作方法的集成测试。我使用内存测试服务器在内存中托管我的api,然后我使用xunit对其进行测试。我担心如果我也为权限设置数据,那么单元测试代码将变得非常混乱。
答案 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。