Witam.
Robię aplikację w ASP.NET MVC 5 (.NET Framework) z Entity Framework 6.2.
Do testów używam NUnit i Moq.
Potrzebuję zrobić test, żeby sprawdzić, czy roleResult.Succeeded
daje true, gdy metoda statyczna RoleExists()
zwraca fałsz dla roli "User".
HomeController.cs
:
private ApplicationDbContext _db;
private RoleManager<IdentityRole> _roleManager;
private ApplicationUserManager _userManager;
public HomeController()
{
_db = new ApplicationDbContext();
_roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(_db));
_userManager = new ApplicationUserManager(new UserStore<ApplicationUser>(_db));
if (!_roleManager.RoleExists("User"))
{
IdentityResult roleResult = _roleManager.Create(new IdentityRole("User"));
}
}
public HomeController(ApplicationDbContext context, ApplicationUserManager userManager, RoleManager<IdentityRole> roleManager, string role) // DI for testing
{
_db = context;
_roleManager = roleManager;
_userManager = userManager;
if (!_roleManager.RoleExists(role))
{
IdentityResult roleResult = _roleManager.Create(new IdentityRole(role));
}
}
HomeTest.cs
:
[Test]
public void HomeController_RoleDoesNotExist_AddRole()
{
var mockContext = new Mock<ApplicationDbContext>();
var mockUserManager = new Mock<ApplicationUserManager>();
var mockRoleManager = new Mock<RoleManager<IdentityRole>>();
mockRoleManager.Setup(x => x.RoleExists("User")).Returns(false); // Moq wyrzuca tutaj błąd
var homeController = new HomeController(mockContext.Object, mockUserManager.Object, mockRoleManager.Object, "User");
// Assert, który muszę zrobić, ale nie wiem jak, bo muszę najpierw wziąć skądś wartość roleResult.Succeeded
}
Po pierwsze: Nie wiem jak zaimplementować kod do mojego testu, który ma być odpowiedzialny za zwrócenie wartości roleResult.Succeeded
, która posłuży mi w Assert.
Po drugie: Moq nie może wykonać Setup dla metod statycznych i nie wiem jak sobie z tym poradzić w mojej sytuacji. Prawdopodobnie potrzebuje zamienić prywatne właściwości w klasie HomeController
z nowymi interfejsami, ale wtedy kod, który jest w konstruktorze HomeController()
będzie miał niezgodność typowania, na przykład: _db = new ApplicationDbContext() nie przekonwertuje na INewDbContext
. Tutaj chodzi o to, że te interfejsy mają implementować to co te obiekty (np: new ApplicationDbContext()
) i mają być użyte do mockowania.
Z góry dzięki za pomoc!