Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/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# 使用GetUserASync(用户)的单元测试控制器_C#_Unit Testing_Asp.net Core_Nunit_Moq - Fatal编程技术网

C# 使用GetUserASync(用户)的单元测试控制器

C# 使用GetUserASync(用户)的单元测试控制器,c#,unit-testing,asp.net-core,nunit,moq,C#,Unit Testing,Asp.net Core,Nunit,Moq,我正在尝试单元测试控制器操作是否返回正确的视图。我正在使用.NETCore、Moq和NUnit 我想测试默认的ManageController 建造师在下面 public ManageController( UserManager<ApplicationUser> userManager, SignInManager<ApplicationUser> signInManager, IEmailSender emailSender, ILogger<M

我正在尝试单元测试控制器操作是否返回正确的视图。我正在使用.NETCore、Moq和NUnit

我想测试默认的
ManageController

建造师在下面

public ManageController(
  UserManager<ApplicationUser> userManager,
  SignInManager<ApplicationUser> signInManager,
  IEmailSender emailSender,
  ILogger<ManageController> logger,
  UrlEncoder urlEncoder)
{
    _userManager = userManager;
    _signInManager = signInManager;
    _emailSender = emailSender;
    _logger = logger;
    _urlEncoder = urlEncoder;
}
经过多次尝试,我最接近的解决方案如下:

我模拟了,
UserManager
,并使用Id为“1”的
ClaimsPrincipal
设置了
GetUserASync
方法。我还将
HttpContext
设置为使用相同的
ClaimsPrincipal
,并将其传递给控制器

由于操作是异步的,我被迫使测试方法异步。当前,由于返回的异步
任务
为空,测试失败。我看不出其余的测试是否通过,因为我无法通过这个错误

[Test]
public async Task Index_UserExists_ReturnsViewAsync()
{
     var mockUserStore = new Mock<IUserStore<ApplicationUser>>();
     var mockUserManager = new Mock<UserManager<ApplicationUser>>(mockUserStore.Object, null, null, null, null, null, null, null, null);

    var user = new ClaimsPrincipal(new ClaimsIdentity(new Claim[]
    {
        new Claim(ClaimTypes.NameIdentifier, "1"),
    }));

    mockUserManager.Setup(x => x.GetUserAsync(user));

    var controller = new ManageController(mockUserManager.Object, null, null, null, null)
    {
        ControllerContext = new ControllerContext()
        {
            HttpContext = new DefaultHttpContext() { User = user }
        }
    };

    //Act
    var result = await controller.Index();

    //Assert
    Assert.IsInstanceOf<ViewResult>(result);
}
[测试]
公共异步任务索引\u UserExists\u ReturnsViewAsync()
{
var mockUserStore=new Mock();
var mockUserManager=new Mock(mockUserStore.Object,null,null,null,null,null,null);
var user=新索赔人(新索赔人)(新索赔[]
{
新索赔(ClaimTypes.NameIdentifier,“1”),
}));
mockUserManager.Setup(x=>x.GetUserAsync(user));
var controller=new ManageController(mockUserManager.Object,null,null,null,null)
{
ControllerContext=新的ControllerContext()
{
HttpContext=new DefaultHttpContext(){User=User}
}
};
//表演
var result=await controller.Index();
//断言
Assert.IsInstanceOf(结果);
}

设置模拟以返回任务,以便等待它并允许代码按预期流动

//...

var appUser = new ApplicationUser {
    //...populate as needed
}

 mockUserManager
    .Setup(_ => _.GetUserAsync(user))
    .ReturnsAsync(appUser); // Allows mocked member to be awaited and return desired type

//...

太好了,谢谢。我尝试过mockUserManager.Setup(=>880;.GetUserAsync(user)).Returns(appUser);但是,如果异步重新执行任务而不是用户,则会出现一个明显的错误。我没想过要让它成为RetrunAsync()
//...

var appUser = new ApplicationUser {
    //...populate as needed
}

 mockUserManager
    .Setup(_ => _.GetUserAsync(user))
    .ReturnsAsync(appUser); // Allows mocked member to be awaited and return desired type

//...