相关疑难解决方法(0)

ASP.Net Core 2.0 SignInAsync返回异常值不能为null,提供者

我有一个ASP.Net Core 2.0 Web应用程序我正在使用单元测试进行改造(使用NUnit).该应用程序工作正常,迄今为止大多数测试工作正常.

但是,测试身份验证/授权(用户是否已登录并可以访问已[Authorize]过滤的操作)失败...

System.ArgumentNullException: Value cannot be null.
Parameter name: provider
Run Code Online (Sandbox Code Playgroud)

...后...

await HttpContext.SignInAsync(principal);
Run Code Online (Sandbox Code Playgroud)

......但目前尚不清楚其根本原因是什么.代码执行在此处停止,并且IDE中没有显示异常,但代码执行返回给调用者,然后终止(但我仍然The program '[13704] dotnet.exe' has exited with code 0 (0x0).在VS的输出窗口中看到)

测试资源管理器显示红色并提供引用的异常(否则我不知道问题.)

我正在努力创建一个指向人们的复制品(到目前为止有点参与其中).

有谁知道如何确定根本原因?这是DI相关的问题(测试中没有提供但是正常执行中需要的东西)?

UPDATE1:提供请求的验证码......

public async Task<IActionResult> Registration(RegistrationViewModel vm) {
    if (ModelState.IsValid) {
        // Create registration for user
        var regData = createRegistrationData(vm);
        _repository.AddUserRegistrationWithGroup(regData);

        var claims = new List<Claim> {
            new Claim(ClaimTypes.NameIdentifier, regData.UserId.ToString())
        };
        var ident = new ClaimsIdentity(claims);
        var principal = new ClaimsPrincipal(ident);

        await HttpContext.SignInAsync(principal); // FAILS HERE

        return …
Run Code Online (Sandbox Code Playgroud)

c# nunit-3.0 asp.net-core-2.0

14
推荐指数
1
解决办法
2720
查看次数

在 C# 单元测试中使用 HttpContext.GetTokenAsync

我正在尝试为我的控制器类编写单元测试,它使用以下命令检索令牌:

string token = await HttpContext.GetTokenAsync("access_token");
Run Code Online (Sandbox Code Playgroud)

因此,我用以下代码模拟了 HttpContext:

public static HttpContext MakeFakeContext()
{
    var serviceProvider = new Mock<IServiceProvider>();
    var authservice = new Mock<IAuthenticationService>();

    authservice.Setup(_ => _.GetTokenAsync(It.IsAny<HttpContext>(), It.IsAny<string>())).Returns(Task.FromResult("token"));
    serviceProvider.Setup(_ => _.GetService(typeof(IAuthenticationService))).Returns(authservice);

    return new DefaultHttpContext
    {
        RequestServices = serviceProvider.Object
    };
}
Run Code Online (Sandbox Code Playgroud)

我正在设置模拟上下文:

var mockcontext = MakeFakeContext();

unitUnderTest.ControllerContext = new ControllerContext
{
    HttpContext = mockcontext
};
Run Code Online (Sandbox Code Playgroud)

现在,当我运行单元测试时,出现以下错误:

System.NotSupportedException:不支持的表达式:_ => _.GetTokenAsync(It.IsAny(), It.IsAny()) 扩展方法(此处:AuthenticationTokenExtensions.GetTokenAsync)不能用于设置/验证表达式。

在我的研究过程中,我偶然发现了一些解决方案,您可以在其中模拟引擎盖下不属于扩展的特定部分。这些是其中一些:Moq IServiceProvider / IServiceScope如何对 HttpContext.SignInAsync() 进行单元测试?. 第二个显示了类似的问题,在我尝试后似乎有效。但由于某种原因,它不适用于 GetTokenAsync 方法。

大家有什么提示吗?

c# unit-testing moq xunit httpcontext

4
推荐指数
3
解决办法
2039
查看次数

在MSTest中模拟ASP.NET Core中的TempData

public ActionResult View(string name)
{
    if (TempData["SessionVariable"] != null)
    {
        FileName = name;  
        return View();
    }
    else
    {  
        return RedirectToAction("index", "Home");
    }

}
Run Code Online (Sandbox Code Playgroud)

测试方法

public void UseCaseView_CorrectRequirements()
{
    var mock = new Mock<Controller>();
    mock.Setup(p => p.TempData["SessionVariable"]).Returns("admin");
    Controller.View("SAMPLE.xml");           
}
Run Code Online (Sandbox Code Playgroud)

会引发错误,例如

结果StackTrace:

在Moq.Mock.SetupGetPexProtected [T,TProperty] [T,TProperty](1 mock, ExpressionC中的模拟1表达式,条件条件)下的C:\ projects \ moq4 \ Source \ Mock.cs:line 883处的Moq.Mock.ThrowIfSetupExpressionInvolvesUnsupportedMember(表达式设置,MethodInfo方法):位于Moq.Mock.SetupGet [T,TProperty](模拟1 mock, Expression1表达式,条件条件)处的Moq.Mock.SetupGet [T,TProperty](模拟1表达式,条件条件)处的第537行:\ projects \ moq4 \ Source \ Mock.cs:line 517处Moq.Mock.Setup [T,TResult] 1 mock, Expression中的C:\ projects \ moq4 \ Source \ …

c# unit-testing mstest moq asp.net-core

3
推荐指数
1
解决办法
1242
查看次数