Я пытаюсь написать 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 и т. Д.?