Asp.net core Asp.Net内核中控制器外部的HttpContext Moq
我想在.NETCore1.0.0中为测试用例moqhttpcontextAsp.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.
[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)。起初我没有注意到这一点,但您的事实测试方法和实际登录方法是否在同一个类中?测试如何在不创建控制器的情况下直接调用登录?如果不创建控制器,则无法传入模拟。