Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单元测试从BasePageModel继承的Razor页面_C#_Unit Testing_Asp.net Core_Razor Pages - Fatal编程技术网

C# 单元测试从BasePageModel继承的Razor页面

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;

我有一个Razor Pages应用程序,其中站点中的所有页面都使用若干服务,并将这些服务添加到一个
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我在记事本中徒手书写时的打字错误。已修复。