C# 单元测试从BasePageModel继承的Razor页面
我有一个Razor Pages应用程序,其中站点中的所有页面都使用若干服务,并将这些服务添加到一个C# 单元测试从BasePageModel继承的Razor页面,c#,unit-testing,asp.net-core,razor-pages,C#,Unit Testing,Asp.net Core,Razor Pages,我有一个Razor Pages应用程序,其中站点中的所有页面都使用若干服务,并将这些服务添加到一个BasePageModel,我从每个Razor页面继承这些服务。我的BasePageModel看起来像这样: public abstract class BasePageModel : PageModel { private IUserClaimsService _userClaims; private IAuthorizationService _authService;
BasePageModel
,我从每个Razor页面继承这些服务。我的BasePageModel
看起来像这样:
public abstract class BasePageModel : PageModel
{
private IUserClaimsService _userClaims;
private IAuthorizationService _authService;
protected virtual IUserClaimsService UserClaimsService => _userClaims ?? (_userClaims = HttpContext.RequestServices.GetService<IUserClaimsService>());
protected virtual IAuthorizationService AuthService => _authService ?? (_authService = HttpContext.RequestServices.GetService<IAuthorizationService>());
}
public class IndexModel : BasePageModel
{
public async Task<ActionResult> OnGet()
{
var HasAccess = (await AuthService.AuthorizeAsync(User, "PermissionName")).Succeeded;
if (!HasAccess)
{
return new ForbidResult();
}
return Page();
}
}
公共抽象类BasePageModel:PageModel
{
私人IUserClaimsService用户索赔;
专用IAAuthorizationService(授权服务);
受保护的虚拟IUserClaimsService UserClaimsService=>\u userClaims???(\u userClaims=HttpContext.RequestServices.GetService());
受保护的虚拟IAAuthorizationService AuthService=>\U AuthService??(\U AuthService=HttpContext.RequestServices.GetService());
}
Razor页面本身看起来像这样:
public abstract class BasePageModel : PageModel
{
private IUserClaimsService _userClaims;
private IAuthorizationService _authService;
protected virtual IUserClaimsService UserClaimsService => _userClaims ?? (_userClaims = HttpContext.RequestServices.GetService<IUserClaimsService>());
protected virtual IAuthorizationService AuthService => _authService ?? (_authService = HttpContext.RequestServices.GetService<IAuthorizationService>());
}
public class IndexModel : BasePageModel
{
public async Task<ActionResult> OnGet()
{
var HasAccess = (await AuthService.AuthorizeAsync(User, "PermissionName")).Succeeded;
if (!HasAccess)
{
return new ForbidResult();
}
return Page();
}
}
公共类索引模型:BasePageModel
{
公共异步任务OnGet()
{
var HasAccess=(等待AuthService.AuthorizeAsync(用户,“PermissionName”))。成功;
如果(!HasAccess)
{
返回新结果();
}
返回页();
}
}
我正在创建单元测试来测试Razor页面上的授权。我的授权具有依赖于用户声明的策略。我想做的是模拟用户声明,并根据页面测试授权是否成功。但是,我无法从测试中访问
UserClaimsService
。我实例化了页面模型,但无法获得任何BasePageModel
值(例如UserClaimsService
)。知道我该怎么做吗?应该避免通过请求服务使用服务定位器反模式。通过构造函数注入跟踪
public abstract class BasePageModel : PageModel {
protected readonly IAuthorizationService authService;
protected BasePageModel(IAuthorizationService authService) {
this.authService = authService;
}
protected async Task<bool> HasAccess(string permissionName) {
return (await authService.AuthorizeAsync(User, permissionName)).Succeeded;
}
}
公共抽象类BasePageModel:PageModel{
受保护的只读IAAuthorizationService authService;
受保护的BasePageModel(IAAuthorizationService authService){
this.authService=authService;
}
受保护的异步任务HasAccess(字符串permissionName){
返回(wait authService.AuthorizeAsync(User,permissionName))。成功;
}
}
剃须刀页面本身将成为
public class IndexModel : BasePageModel {
public IndexModel(IAuthorizationService authService) : base (authService) {
//...
}
public async Task<ActionResult> OnGet() {
if (!HasAccess("PermissionName")) {
return new ForbidResult();
}
return Page();
}
}
公共类索引模型:BasePageModel{
公共索引模型(IAAuthorizationService authService):基(authService){
//...
}
公共异步任务
在涉及到用户声明和授权时,您似乎也混合了交叉关注点,但我猜这超出了当前所问的范围
参考作为旁白,应该避免通过请求服务使用服务定位器反模式。通过构造函数注入遵循显式依赖原则。也应该证明对您有用。发现这个@Nkosi:我知道这些方法,但由于构造函数位于BasePageModel中,而不是t下的当前页面est的模型。我希望能够访问该基础构造函数,但一直无法访问。在基础模型中,派生类没有可调用的构造函数。您有两个字段和两个属性,但没有可供引用的基础构造函数库。在我们的体系结构中,身份验证确实是(并按以下方式处理)一个横切关注点,但每页授权足够复杂,无法作为横切关注点处理。除了根据授权规则允许/不允许访问页面(根据我们所在页面的不同而有所不同),我们还使用授权来显示/隐藏按钮和字段。Nkosi:我发现一个语法错误authService的设置:“运算符“==”无法应用于“Task”和“AuthorizationResult”类型的操作数。我尝试了各种修复方法,但无法使其正常工作。如有任何提示,我们将不胜感激。@LaurieDickinson我在记事本中徒手书写时的打字错误。已修复。