2017-04-03 68 views
4

我的應用程序是一個ASP.NET Core 1.0 Web API。集成測試使用[Authorize]屬性裝飾的控制器

正如標題所說:如何測試其裝飾與Authorize屬性的控制?

例如這個控制器和TestMethod的:

[TestMethod] 
    public void GetSomeDataTest() 
    { 
    var controller = new MyController(); 
    Assert.AreEqual(controller.GetSomeData(), "Test"); 
    } 

    [Authorize] 
    public ActionResult GetSomeData() 
    { 
    return this.Content("Test"); 
    } 

這僅僅是一個例子代碼,使其能夠爲你們來回答。 Iam實際上通過TestServer對象調用Controller

already被要求,但接受的答案不工作了。 任何建議如何我可以「僞造」用戶的真實性?

謝謝

回答

-1

那麼你實際上並沒有調用控制器,而你正在運行的模擬測試,因此沒有什麼是傳統的方式發生像ASP.NET引擎處理您的請求 - >請求通過HTTP管道(因此授權模塊)。

因此,在測試時,您應該只關注控制器操作方法的內部邏輯,而不是單元測試方法中的Authorize屬性原因,否則不會進行身份驗證/授權。您將設置模擬並調用控制器操作方法,同樣也可以使用其他方法。

+0

您好感謝拉胡爾你爲你的答案。但是有可能測試一個用[Authorize]屬性裝飾的控制器嗎?如果是這樣怎麼可能? –

+0

Iam實際上是通過TestServer調用控制器,但我只是想讓事情變得簡單,那就是爲什麼我要張貼這段代碼 –

+0

Moritz Schmidt,你如何在TestServer中使用Authorize? – Brian

4

你可以索賠原則設置爲當前線程

[TestInitialize] 
public void Initialize() 
{ 
    var claims = new List<Claim>() 
    { 
     new Claim(ClaimTypes.Name, "UserName"), 
     new Claim(ClaimTypes.Role, "Admin") 
    }; 
    var identity = new ClaimsIdentity(claims, "TestAuth"); 
    var claimsPrincipal = new ClaimsPrincipal(identity); 
    Thread.CurrentPrincipal = claimsPrincipal; 
} 

更新

對於.NET核心您可以將用戶設置到控制器上下文

private MyController _ctrl; 

[TestInitialize] 
public void Initialize() 
{ 
    var user = new ClaimsPrincipal(new ClaimsIdentity(new Claim[] 
    { 
     new Claim(ClaimTypes.Name, "UserName"), 
     new Claim(ClaimTypes.Role, "Admin") 
    })); 

    _ctrl = new MyController(); 
    _ctrl.ControllerContext = new ControllerContext() 
    { 
     HttpContext = new DefaultHttpContext() { User = user } 
    }; 
} 

[TestMethod] 
public void GetSomeDataTest() 
{ 
    Assert.AreEqual(_ctrl.GetSomeData(), "Test"); 
} 
+0

你好,謝謝你的回答。由於最後一行「Thread.CurrentPrincipal = claimsPrincipal;」,Visual Studio給了我一個錯誤。 錯誤是:「無法解析符號'CurrentPrincipal'」 –

+1

@MoritzSchmidt您是否添加了名稱空間「System.Threading」 –

+0

是的,它似乎像CurrentPrincipial已棄用 –