NUnit Test UserManager, roleManager в ядре asp.net - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь написать модульные тесты для моего контроллера, который использует диспетчер пользователей и диспетчер ролей.

У меня есть операции, связанные с созданием пользователей, созданием ролей, добавлением и удалением пользователей в роли и из ролей..

Я передаю usermanager, signInManager как зависимости через конструктор контроллера.

    private readonly IHostingEnvironment hostingEnvironment;

    public IHostingEnvironment HostingEnvironment => hostingEnvironment;

public AdminController(IHostingEnvironment environment, SignInManager<IdentityUser> signInManager, ILogger<LoginModel> logger, RoleManager<IdentityRole> roleManager, UserManager<IdentityUser> userManager)
{
    _signInManager = signInManager;
    _logger = logger;
    _roleManager = roleManager;
    _userManager = userManager;
    hostingEnvironment = environment;
}

Мне нужно проверить, успешно ли пользователи добавляются в роли, удаляются из ролей и т. Д..

Я не хочу тестировать сами сервисы, но только операции.

Я отделил операции следующим образом, чтобы зафиксировать любые исключения.

public async Task<bool> AddUserToRole(IdentityUser user, string role)
        {
            try
            {
                var addUserToRole = await _userManager.AddToRoleAsync(user, role);
                if (addUserToRole.Succeeded)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch(Exception e)
            {
                throw new Exception("OperationFailed");
            }

            return false;

        }

Точно так же яЯ развязал все операции с участием userManager и вызвал вышеуказанные функции в действии контроллера.

Для тестирования я сделал следующее:

    [TestFixture]
    public class AdminControllerTest
    {
        protected TestContext db;
        protected Context _db;
        protected SignInManager<IdentityUser> signInManager;
        protected ILogger<LoginModel> logger;
        protected RoleManager<IdentityRole> roleManager;
        protected UserManager<IdentityUser> userManager;
        protected IHostingEnvironment hostingEnvironment;

[TestCase]
        public void Verify_AdminController_Is_Decorated_With_Authorize_Attribute()
        {
        var userEmail = _db.AspNetUsers.Select(x => x.Email).FirstOrDefault();
        var user =await userManager.FindByEmailAsync(userEmail);

        var userRole = "Supervisor";
        AdminController adminController = new AdminController(hostingEnvironment, signInManager, logger, roleManager, userManager);
        var actionResult = adminController.AddUserToRole(user, userRole).Result;
        Assert.IsTrue(actionResult);
        }

Выше не работает.

  • Я верю, что это потому, что;userManager в DevProject и Test Project - это разные экземпляры.

Я пытался издеваться над сервисами, используя Moq.Но если я запускаю службы, я не могу передать их экземпляру контроллера.

Если я высмеиваю сам контроллер;Я не могу использовать его действия;Возвращает Null;

Я не совсем понимаю концепцию насмешки.

Каков наилучший способ решения вышеуказанной проблемы.Я использую Asp.Net Core 2.1 и Nunit 3.0

Спасибо:)

1 Ответ

0 голосов
/ 05 марта 2019

Похоже, вы еще не отделили зависимости от конструктора AdminController.

Вместо передачи реализации вам нужно будет передать абстракцию / интерфейсы:

public AdminController(IHostingEnvironment environment, 
                       ISignInManager<IdentityUser> signInManager, 
                       ILogger<LoginModel> logger, 
                       IRoleManager<IdentityRole> roleManager, 
                       IUserManager<IdentityUser> userManager)

Обратите внимание, что я добавил только префикс I, но это означает, что вам потребуется рефакторинг вашего кода для прохождения интерфейсов, как я уже упоминал.

Теперь мы можем легко смоделировать AdminController с помощью:

[TestFixure]
public class AdminControllerTests
{
    private AdminController _adminController;
    private IHostingEnvironment _hostingEnvironment = new Mock<IHostingEnvironment>();
    private ISignInManager<IdentityUser> _signInManager = new Mock<ISignInManager<IdentityUser>>(); 

_signInManager потребуется настройка, которая использует метод, который возвращает ISignInManager в вашем ISignInManager, давайте предположим,его имя его Builder().* Обратите внимание, что существуют другие способы насмешки, вот два способа или рассмотрите возможность использования autofac

    [SetUp]
    public void SetUp()
    {
        _signInManager.Setup(a => a.Builder()).Returns(new[] { new IdentityUser() });  
        //Do the same for the rest of the dependencies.
        //...
        _adminController = new AdminController(_hostingEnvironment, _signInManager.Object, ...);
    }

Теперь вы можете использовать экземпляр _adminController(См. Правильное именование соглашение для методов испытаний):

    [Test]
    public void Verify_AdminController_Is_Decorated_With_Authorize_Attribute()
    {
        //...
        var actionResult = _adminController.AddUserToRole(user, userRole).Result;
        //...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...