Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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
Asp.net core Asp.Net内核中控制器外部的HttpContext Moq_Asp.net Core_Xunit - Fatal编程技术网

Asp.net core Asp.Net内核中控制器外部的HttpContext Moq

Asp.net core Asp.Net内核中控制器外部的HttpContext Moq,asp.net-core,xunit,Asp.net Core,Xunit,我想在.NETCore1.0.0中为测试用例moqhttpcontext [Fact] public async Task Login() { ApplicationUser user = new ApplicationUser() { UserName = "siddhartha@promactinfo.com", Email = "siddhartha@promactinfo.com", Name = "siddhartha" }; await _userManager.

我想在.NETCore1.0.0中为测试用例moqhttpcontext

[Fact]
public async Task Login()
{
     ApplicationUser user = new ApplicationUser() { UserName = "siddhartha@promactinfo.com", Email = "siddhartha@promactinfo.com", Name = "siddhartha" };
     await _userManager.CreateAsync(user, "Something@123");
     var userAdded = await _userManager.CreateAsync(user);
     var result = await Login("siddhartha@promactinfo.com", "Something@123");
     Assert.Equal("siddhartha", result);
}
这是我的密码:

public async Task<string> Login(string email, string password)
{
var result = await _signInManager.PasswordSignInAsync(email, password, false, lockoutOnFailure: false);
if (result.Succeeded)
   {
       return HttpContext.User.Identity.Name;
   }
   else
   {
       return "";
   }
}
它将失败,并获取错误消息:

HttpContext不能为null

这是我的服务-startup.cs

 public void ConfigureServices(IServiceCollection services)
    {
        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<PromactOauthDbContext>()
            .AddDefaultTokenProviders();
        services.AddMvc().AddMvcOptions(x => x.Filters.Add(new GlobalExceptionFilter(_loggerFactory)));
    }
public void配置服务(IServiceCollection服务)
{
服务.额外性()
.AddEntityFrameworkStores()
.AddDefaultTokenProviders();
services.AddMvc().addmvcopions(x=>x.Filters.Add(新的GlobalExceptionFilter(_loggerFactory));
}

我认为该错误来自于对SignInManager的构造函数进行的空检查。我看不出您是如何为测试构建SignInManager的,因此我无法确定您是否通过了某些测试,但我怀疑没有


如果是这种情况,请创建IHttpContextAccessor的模拟,并设置HttpContext属性以返回新的DefaultHttpContext(),然后将模拟对象传递到SignInManager。

,而不使用控制器。我在.NETCore中有moqHttpContext。并在存储库中使用HttpContext

像这样在测试用例项目中注册HttpContext

public void ConfigureServices(IServiceCollection services)
{       
        var authenticationManagerMock = new Mock<AuthenticationManager>();
        var httpContextMock = new Mock<HttpContext>();
        httpContextAccessorMock.Setup(x => x.HttpContext.User.Identity.Name).Returns("Siddhartha");
        httpContextMock.Setup(x => x.Authentication).Returns(authenticationManagerMock.Object);
        var httpContextAccessorMock = new Mock<IHttpContextAccessor>();
        httpContextAccessorMock.Setup(x => x.HttpContext).Returns(httpContextMock.Object);
        var httpContextMockObject = httpContextAccessorMock.Object;
        services.AddScoped(x => httpContextAccessorMock);
        services.AddScoped(x => httpContextMockObject);
        serviceProvider = services.BuildServiceProvider();
}
public void配置服务(IServiceCollection服务)
{       
var authenticationManagerMock=new Mock();
var httpContextMock=new Mock();
httpContextAccessorMock.Setup(x=>x.HttpContext.User.Identity.Name).Returns(“悉达多”);
httpContextMock.Setup(x=>x.Authentication).Returns(authenticationManagerMock.Object);
var httpContextAccessorMock=new Mock();
httpContextAccessorMock.Setup(x=>x.HttpContext).Returns(httpContextMock.Object);
var httpContextMockObject=httpContextAccessorMock.Object;
AddScoped(x=>httpContextAccessorMock);
addScope(x=>httpContextMockObject);
serviceProvider=services.BuildServiceProvider();
}
然后您将获得HttpContext.User.Identity.Name=Siddhartha

public async Task<string> Login(string email, string password)
{
var result = await _signInManager.PasswordSignInAsync(email, password, false, lockoutOnFailure: false);
    if (result.Succeeded)
    {
        return HttpContext.User.Identity.Name;
    }
    else
    {
         return "";
    }
}
公共异步任务登录(字符串电子邮件、字符串密码)
{
var result=wait _signInManager.PasswordSignInAsync(电子邮件、密码、false、锁定失败:false);
if(result.successed)
{
返回HttpContext.User.Identity.Name;
}
其他的
{
返回“”;
}
}

根据你的建议,我试过了,但仍然没有成功@runesun您需要提供更多的代码。我无法告诉您如何在提供的代码中建立管理器依赖项(即SignInManager)。起初我没有注意到这一点,但您的事实测试方法和实际登录方法是否在同一个类中?测试如何在不创建控制器的情况下直接调用登录?如果不创建控制器,则无法传入模拟。