11

我有一些ASP.NET MVC控制器代碼,用於檢查用戶是否經過身份驗證,如果是,它會檢查它是否具有特定的聲明。工作正常。有沒有什麼辦法可以模仿我的ASP.NET MVC Web應用程序中的索賠負責人?

我有一些單元測試,我需要嘲笑IPrincipal(這很容易做到)......但我不知道如何檢查索賠!我通常這樣做

public static ClaimsPrincipal ClaimsPrincipal(this Controller controller) 
{ 
    return controller.User as ClaimsPrincipal; 
} 

和一些控制器代碼...

​​

但是當我測試這個在我的單元測試這一切都失敗..因爲我不知道我怎麼能mockClaimsPrincipal

任何想法?

回答

3

也大多數的方法是虛擬的,所以這些都是可以模擬的。

6

我不確定你的意思是「模擬」。但是你可以簡單地從頭開始創建一個ClaimsPrincipal。首先創建一個ClaimsIdentity - 添加您需要的聲明和身份驗證方法。然後用ClaimsPrincipal包裝它。

10

嘲諷ClaimsPrincipal心不是

var cp = new Mock<ClaimsPrincipal>(); 
cp.Setup(m => m.HasClaim(It.IsAny<string>(),It.IsAny<string>())) 
    .Returns(true); 

但是這取決於如何控制器能訪問它會太困難。看看這個問題How to mock Controller.User using moq

這將使你是這樣的:

var cp = new Mock<ClaimsPrincipal>(); 
cp.Setup(m => m.HasClaim(It.IsAny<string>(), It.IsAny<string>())).Returns(true); 

var sut = new UtilityController(); 

var contextMock = new Mock<HttpContextBase>(); 
contextMock.Setup(ctx => ctx.User).Returns(cp.Object); 

var controllerContextMock = new Mock<ControllerContext>(); 
controllerContextMock.Setup(con => con.HttpContext).Returns(contextMock.Object); 

sut.ControllerContext = controllerContextMock.Object; 

var viewresult = sut.Index(); 
相關問題