2017-04-17 36 views
0

我正在研究ASP.NET Core WebApi。我們有用自定義屬性裝飾的動作方法。例如具有屬性的Web API操作的集成測試策略

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

CheckPermission屬性存在於共享庫中,並且也會被其他Api使用。

CheckPermisision屬性內部使得httpclient調用API以獲得布爾值true或false,並在未授權的情況下返回適當的狀態碼。

我應該如何處理以上操作方法的集成測試。我使用內存測試服務器在內存中託管我的api,然後使用xunit在其上運行測試。我很擔心,如果我也爲權限設置數據,那麼單元測試代碼會變得非常混亂。

回答

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