c# - 如何模拟 User.Identity
问题描述
我想在控制器中测试一种方法
public class CardController : Controller
{
IRepository repository;
public CardController(IRepository repo)
{
repository = repo;
}
[AcceptVerbs("Get", "Post")]
public IActionResult CheckPublicID(string PublicID)
{
if (repository.CheckCardName(PublicID, User.Identity.Name))
{
return Json(true);
}
return Json(false);
}
如何将 HttpContext 中的模拟 User.Identity.Name 添加到我的模拟控制器?
[Fact]
public void CheckPublicIDIsEmpty()
{
Mock<IRepository> mock = new Mock<IRepository>();
mock.Setup(r => r.CheckCardName("TestID", "TestName")).Returns(false);
//mock User.Identity.Name
CardController cardController = new CardController(mock.Object);
var result = cardController.CheckPublicID("TestID");
var viewResult = Assert.IsType<JsonResult>(result);
Assert.Equal(false, viewResult.Value);
}
*更改断言
解决方案
您需要模拟HttpContext
控制器上的例如:
var httpContext = new DefaultHttpContext()
{
User = new System.Security.Claims.ClaimsPrincipal(new GenericIdentity("username"))
};
var actionContext = new ActionContext(httpContext, new Microsoft.AspNetCore.Routing.RouteData(),
new Microsoft.AspNetCore.Mvc.Controllers.ControllerActionDescriptor());
cardController.ControllerContext = new Microsoft.AspNetCore.Mvc.ControllerContext(actionContext);
推荐阅读
- regex - 正则表达式检查从一个字符串到另一个字符串是否包含搜索字符串
- angular - ElectronJs 和 Angular 应用程序,未在 file:// 协议上设置 cookie
- javascript - 输入类型编号未获得焦点且未设置光标
- c - 在不复制源数据的情况下实现 memmove
- java - 格子onSuccessCallback不调用android java
- performance - 加载场景时 Unity 的最佳实践是什么。保持默认启用所需的对象或通过代码在 Start() 中启用它们?
- javascript - 社交登录不适用于隐身模式
- python - 交互式 Altair 图表中的条形宽度
- android - 如何使用意图从我自己的应用程序加入团队会议
- c++ - 为什么我的proto文件字节类型生成为c++类型是字符串*?