【发布时间】:2019-08-20 02:52:45
【问题描述】:
我正在尝试研究如何将单元测试添加到我的项目中。我认为最好从一个空白项目开始并从头开始解决,而不是将其添加到我的主项目中。一旦我理解了这个过程,我认为我可以开始重构我的项目以添加测试。
网络应用程序
所以我创建了一个 Web 应用程序并为其添加了默认用户身份。
这给了我一个看起来像这样的启动
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<IdentityUser>()
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
然后我创建了一个简单的控制器并在构造函数中传递了用户管理器。
[Route("api/[controller]")]
[ApiController]
public class SweetController : ControllerBase
{
private readonly UserManager<IdentityUser> _userManager;
public SweetController(UserManager<IdentityUser> userManager)
{
_userManager = userManager;
}
public async Task<int> NumberOfGummyBearsForUser(string userId)
{
var user = await _userManager.FindByIdAsync(userId);
var userHasASweetTooth = await _userManager.IsInRoleAsync(user, "SweetTooth");
if (userHasASweetTooth)
{
return 100;
}
else
{
return 1;
}
}
}
单元测试
我一直在尝试做的第一件事是模拟这个用户管理器,但它不起作用。
public void Test1()
{
// Arrange
var mockUser = new Mock<UserManager<IdentityUser>>();
var userManager = new UserManager(mockRepo.Object); <-- error here see image below
var controller = new SweetController(userManager.Object);
// Act
var result = await controller.NumberOfGummyBearsForUser("123");
// Assert
Assert.Equal(100, result);
}
错误看起来像这样
我认为我需要传递更多来创建这个 usermanager 对象,但我不确定我找到的所有教程都使用 ApplicationUser 而不是 IdentityUser,所以我不知道如何模拟这个对象。
【问题讨论】:
-
你不能只传递
var userManager = mockRep.Object,因为它是 userManager 的模拟吗? -
MockHelpers来自身份测试本身可能是一个很好的参考点。 -
当
UserManager<T>是你想要模拟的对象时,你为什么要new向上UserManager<T>不清楚? -
@Tseng 好吧,我也不确定,因为我说过我正在尝试学习如何做到这一点,我正在关注 alastairchristian.com/… 如果您有更好的方法,请随时添加 anwser
-
mockUser已经是UserManager<T>的模拟。你将它传递给 controller(显然你想测试控制器,NOT UserManager,ASP.NET Core Identity 团队已经为你做了:P
标签: c# asp.net-core asp.net-identity moq xunit