Есть метод, который добавляет нового пользователя. Если пользователь добавлен - перенаправляет на index
, иначе возвращает вьюшку с моделью.
[HttpPost]
[Authorize(Roles = "admin")]
[ValidateAntiForgeryToken]
public async Task<ActionResult> AddNewUser(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser { UserName = model.UserName, Email = model.Email };
var result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
UserManager.AddToRole(user.Id, "moder");
TempData["message"] = string.Format("Пользователь \"{0}\" добавлен", model.UserName);
return RedirectToAction("index");
}
AddErrors(result);
}
return View(model);
}
И есть тест, который добавляет уникального пользователя, то есть, должно произойти перенаправление на index
.
[TestMethod()]
public void AddNewUser_Add_Unique_User()
{
// Cоздание имитированного хранилища данных
Mock<ICarRepository> mock = new Mock<ICarRepository>();
// Cоздание пользователя
var user = new ApplicationUser { UserName = "Test2", Email = "Test2@gmail.com" };
// Cоздание имитированного хранилища пользователей
var store = new Mock<IUserStore<ApplicationUser>>(MockBehavior.Strict);
store.As<IUserStore<ApplicationUser>>().Setup(x => x.FindByIdAsync(It.IsAny<string>())).ReturnsAsync(user);
// Создание объекта модели
RegisterViewModel reg = new RegisterViewModel {
Email = "Test@testmail.com",
UserName = "Test",
Password = "Kappa123+",
ConfirmPassword = "Kappa123+"
};
// Создание контроллера
AdminController controller = new AdminController(mock.Object);
controller.UserManager = new ApplicationUserManager(store.Object);
var result = controller.AddNewUser(reg);
// Проверка типа результата метода
Assert.IsInstanceOfType(result, typeof(Task<ViewResult>)); // Как узнать?
}
public ViewResult Index()
{
...
}
Как узнать в тесте, что выполнилось именно return RedirectToAction("index");
, а не return View(model);
?
Такой вариант подходит?
var result = controller.AddNewUser(reg).Result as RedirectToRouteResult;
Assert.IsNotNull(result);
Мой ответ в принципе, идентичен тому, который написал @Nikita -- не сомневайтесь, это подходит и это работает. Всё там правильно.
Разве что.
Во-первых, я приведу ссылку на хороший курс где подробно описывается asp.net mvc под капотом. Вот ссылка на фрагмент, где как раз рассматривается именно тестирование редиректов: https://metanit.com/sharp/mvc5/18.6.php
Во-вторых, я хочу отметить, что вы можете не только проверять, что результат является редиректом, но и проверять куда именно идёт редирект -- это нужно даже когда у вас он всего один и тем более, если их несколько.
[TestMethod]
public void CreatePostAction_RedirectToIndexView()
{
// arrange
string expected = "Index";
var mock = new Mock<IRepository>();
Computer comp = new Computer();
HomeController controller = new HomeController(mock.Object);
// act
RedirectToRouteResult result = controller.Create(comp) as RedirectToRouteResult;
// assert
Assert.IsNotNull(result);
Assert.AreEqual(expected, result.RouteValues["action"]);
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Unity, C#Есть молдель с animator, в котором уже настроены стейты-анимации и параметры для переходов между ними
Хочу прочитать JSON файл с использованием View модели (класса с названием всех переменных), но возникла загвоздкаНекоторые имена в файле имеют...
Представим ситуацию: В Visual Studio есть решение, которое состоит из 3 проектовВ каждом из проектов в файле app
Добрый день, вот допустим у меня есть код который посылает гет запрос