我正在尝试单元测试我的控制器代码,它从ClaimsPrincipal. Current获取信息。在控制器代码I中
public class HomeController {
public ActionResult GetName() {
return Content(ClaimsPrincipal.Current.FindFirst("name").Value);
}
}
字符串
我试图用claimsPrincipal来模拟我的claimsPrincipal,但我仍然没有从claim中获得任何模拟值。
// Arrange
IList<Claim> claimCollection = new List<Claim>
{
new Claim("name", "John Doe")
};
var identityMock = new Mock<ClaimsIdentity>();
identityMock.Setup(x => x.Claims).Returns(claimCollection);
var cp = new Mock<ClaimsPrincipal>();
cp.Setup(m => m.HasClaim(It.IsAny<string>(), It.IsAny<string>())).Returns(true);
cp.Setup(m => m.Identity).Returns(identityMock.Object);
var sut = new HomeController();
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);
controllerContextMock.Setup(con => con.HttpContext.User).Returns(cp.Object);
sut.ControllerContext = controllerContextMock.Object;
// Act
var viewresult = sut.GetName() as ContentResult;
// Assert
Assert.That(viewresult.Content, Is.EqualTo("John Doe"));
型
在我运行单元测试时,viewresult.Content为空。有没有人能帮我加个假声明。- 谢谢-谢谢
2条答案
按热度按时间7xllpg7q1#
你不需要mock
ClaimsPrincipal
,它没有外部依赖,你可以创建它un-mocked:字符串
我不知道你在测试什么。当然,“John Doe”不会是
viewResult.Content
的一部分,因为它从未被设置为这个。cig3rfwq2#
首先,您在测试中缺少这一行:
字符串
(and然后在TearDown中清理)。
其次,正如@trailmax所提到的,模拟主体对象是不切实际的。在您的例子中,
ClaimsPrincipal.FindFirst
(根据反编译的源代码)查看其示例的私有字段,这就是mocking没有帮助的原因。我更喜欢使用两个简单的类,它们允许我对基于声明的功能进行单元测试:
型
那么你的测试就缩小到
型
现在通过了我刚刚验证了