Тестирование операций с базой данных с использованием Nunit Testing с использованием классов-обёрток - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь написать N модульных тестов.Новое в концепции модульного тестирования.У меня есть различные операции с базой данных, которые должны быть проверены.После просмотра некоторых блогов;Я создал базу данных для тестирования (идентична базе данных проекта);

Когда я пишу тестовые примеры и тесты переходят в контроллер;Совершенно очевидно, что операции с базой данных выполняются в реальном контексте базы данных проекта, а не в тестовом контексте базы данных.

Использование классов-оболочек считается решением;Я много читал, но понятия не имею, как это сделать.

Кроме того, я использую такие сервисы, как userManager, signInManager и т. Д. Через конструктор контроллера.

Я продолжаюполучение ошибок нулевой ссылки на операциях db и ошибок, говорящих о том, что UserManager равен null;Я понимаю, что могу просто создать класс запуска и внедрить userManager и т. Д. В тестовый проект.

Однако я не знаю, является ли это хорошей практикой.

Именно так я и реализуюразличные зависимости (SetUp):

 public class HostingClass
    {
        protected IHostingEnvironment HostingEnvironment { get; private set; }

        public HostingClass(IHostingEnvironment host)
        {
            HostingEnvironment = host;
        }
    }

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



        public ControllerTest()
        {
            db = new TestContext();
            _db = new ActualDbContext ();
        }

        public IHostingEnvironment hosting()
        {
            var mockEnvironment = new Mock<IHostingEnvironment>();
            mockEnvironment
                .Setup(m => m.WebRootPath)
                .Returns("path");
            return mockEnvironment.Object;
        }


        public HttpContext GetHttpContext(string name = "test", string[] roles = null)
        {

            roles = new string[] { "role1" };
            var identity = new GenericIdentity(name, string.Empty);
            var principal = new GenericPrincipal(identity, roles ?? new string[] { });
            var contextUser = principal;
            var httpContext = new DefaultHttpContext()
            {
                User = contextUser
            };
            return httpContext;
        }

Действие контроллера с проверяемой операцией Db:

 public async Task<IActionResult> AddToDb(ViewModel addToDb)
        {

           IdentityUser user = new IdentityUser { UserName = addToDb.Email, Email = addToDb.Email };
           string password = addToDb.FirstName.ToLower() + "P@ssword12";
           db.Add(addToDb);
           db.SaveChanges();
    ----
    ----
    ----
           var result = await _userManager.CreateAsync(user, password);

            try
            {
                if (result.Succeeded)
                {
                    if (!await _roleManager.RoleExistsAsync("Role1"))
                    {
                        IdentityRole userRole = new IdentityRole("Role1");
                        IdentityResult createRole = await _roleManager.CreateAsync(userRole);
                        if (createRole.Succeeded)
                        {
                            await _userManager.AddToRoleAsync(user, "Role1");
                        }
                    }
                    else
                    {
                        await _userManager.AddToRoleAsync(user, "Role1");
                    }

}

Контрольный пример:

public async Task Verify_AddToDb_Successful_True()
{
    var databaseData= db.TableA.Select(x => x).FirstOrDefault();

    hostingEnvironment = hosting();
    Controller controller = new Controller(hostingEnvironment, signInManager, logger, roleManager, userManager);
    var actionResult = await controller.AddToDb(databaseData) as RedirectToActionResult;
    Assert.AreEqual("ViewName", actionResult.ActionName);
}

Проверка роли:

Добавление пользователя в роль:

[TestCase]
public async Task Verify_RoleManagement_AddUserToRole_True()
{
    var user = new IdentityUser();
    user.Email = "roleadditiontest.com";
    var userRole = "Role2";
    Controller controller = new Controller(hostingEnvironment, signInManager, logger, roleManager, userManager);
    var actionResult = adminController.AddUserToRole(user, userRole).Result;
    Assert.IsTrue(actionResult);
}

AddUserToRole в основном просто берет пользователя и роль и использует usermanager для добавления пользователя в роль.

Для проверкивышеупомянутая операция, я использую тест Db на основе нескольких статей.Я не могу следовать шаблону репозитория

У меня нет ни малейшего понятия, с чего начать;Я использую NUnit 3;Я хочу знать следующее:

  • Как проверить операции базы данных, такие как Добавить, Обновить, Удалить и т. Д. В NUnit, используя тестовую базу данных.
  • Как проверить операции, выполненные с помощью usermanager, rolemanager и т. Д.?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...