Dot-Net

有什麼方法可以在我的 ASP.NET MVC Web 應用程序中模擬聲明主體?

  • March 17, 2016

我有一些ASP.NET MVC控制器程式碼可以檢查使用者是否經過身份驗證,如果是,它會檢查它是否有特定的聲明。工作正常。

我有一些單元測試,我需要模擬一個IPrincipal(這很容易做到)……但我不確定如何檢查索賠!我通常會做類似的事情

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

和一些控制器程式碼……

this.ClaimsPrincipal().HasClaim(x => x.......);

但是當我在我的單元測試中測試這個時這一切都失敗了..因為我不確定我怎麼mockClaimsPrincipal

有任何想法嗎?

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

模擬 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();

引用自:https://stackoverflow.com/questions/14190066