【发布时间】:2019-11-01 07:27:14
【问题描述】:
我有一个 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>());
}
Razor 页面本身看起来像这样:
public class IndexModel : BasePageModel
{
public async Task<ActionResult> OnGet()
{
var HasAccess = (await AuthService.AuthorizeAsync(User, "PermissionName")).Succeeded;
if (!HasAccess)
{
return new ForbidResult();
}
return Page();
}
}
我正在创建单元测试来测试我的 Razor 页面上的授权。我的授权具有取决于用户声明的策略。我想做的是模拟用户声明并根据页面测试授权是成功还是失败。但是,我无法通过我的测试访问UserClaimsService 来模拟它。我实例化了 pageModel,但无法获取任何 BasePageModel 值(例如 UserClaimsService)。知道我该怎么做吗?
【问题讨论】:
-
顺便说一句,应该避免通过请求服务使用的服务定位器反模式。通过构造函数注入遵循显式依赖原则。
-
@Nkosi:我知道这些方法,但由于构造函数位于 BasePageModel 中,而不是当前被测页面的模型中。我希望能够访问该基本构造函数,但无法访问。
-
您在基模型中没有可供派生类调用的构造函数。您有两个字段和两个属性,但没有基本构造函数
标签: c# unit-testing asp.net-core razor-pages