ASP.NET MVC 5 с NUnit и Moq;как издеваться над RoleManager, чтобы можно было настроить его методы расширения? - PullRequest
0 голосов
/ 30 декабря 2018

У меня есть приложение ASP.NET MVC 5 (.NET Framework) с Entity Framework 6.2.Для тестирования я использую фреймворки NUnit и Moq.

Мне нужно проверить, истинно ли roleResult.Succeeded, когда метод RoleExists() extension (static) возвращает false для роли "User".

HomeController.cs:

private ApplicationDbContext _db;
private RoleManager<IdentityRole> _roleManager;
private ApplicationUserManager _userManager;

// Hard Entity Framework dependency (working application)
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"));
    }
}

// Dependency injection only for testing
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 says: nope :<

    var homeController = new HomeController(mockContext.Object, mockUserManager.Object, mockRoleManager.Object, "User");

    // Some Assert that I really don't know to deal with.
}

Первое: я не знаю, как реализовать код тестирования, отвечающий за получение значения roleResult.Succeeded.

Второе: Moq не может настроить статические методы, и я не знаю, как с этим справиться в моей ситуации.Возможно, мне придется заменить частные свойства в моем классе HomeController на несколько новых интерфейсов, но тогда моя зависимость Hard Entity Framework перестанет работать из-за, например: _db = new ApplicationDbContext() cannot be converted to IMyNewAppDbContext.

Спасибо за помощь.

...