Как узнать, какой return сработал в unit test

251
04 мая 2017, 11:28

Есть метод, который добавляет нового пользователя. Если пользователь добавлен - перенаправляет на 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);?

Answer 1

Такой вариант подходит?

var result = controller.AddNewUser(reg).Result as RedirectToRouteResult;
Assert.IsNotNull(result);
Answer 2

Мой ответ в принципе, идентичен тому, который написал @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"]);
}
READ ALSO
Unity - как написать &ldquo;после того как анимация закончится&rdquo;?

Unity - как написать “после того как анимация закончится”?

Unity, C#Есть молдель с animator, в котором уже настроены стейты-анимации и параметры для переходов между ними

563
Символ в название переменной

Символ в название переменной

Хочу прочитать JSON файл с использованием View модели (класса с названием всех переменных), но возникла загвоздкаНекоторые имена в файле имеют...

203
Cтроки подключения в App.config и Web.config

Cтроки подключения в App.config и Web.config

Представим ситуацию: В Visual Studio есть решение, которое состоит из 3 проектовВ каждом из проектов в файле app

501
C# .Net 2.0 послать get запрос

C# .Net 2.0 послать get запрос

Добрый день, вот допустим у меня есть код который посылает гет запрос

457