Получение переданных данных ViewBag из экземпляра View Component (например, в тестах) - PullRequest
1 голос
/ 01 июля 2019

Я пытаюсь переложить книгу Адама Фримена "ASP .Net MVC" и создать Sport Store (приложение из книги). Эта книга о классическом .Net, но я пытаюсь реализовать приложение с помощью .NET Core.

В одной главе автор предлагает провести модульный тест. Я опишу условия. У меня есть класс View Component:

public class CategoryNav : ViewComponent
{
    private readonly IProductRepository _repository;

    public CategoryNav(IProductRepository repository)
    {
        _repository = repository;
    }

    public IViewComponentResult Invoke(string currentCategory)
    {
        ViewBag.SelectedCategory = currentCategory;

        var categories = _repository.Products
            .Select(x => x.Category)
            .Distinct()
            .OrderBy(x => x);

        return View(categories);
    }
}

Это создаст что-то вроде боковой панели с фильтром категорий (это слева):

enter image description here

Я собираюсь выделить текущую категорию. Но я хочу создать тест раньше. Тест предназначен для определения того, выделена кнопка категории или нет.

[Test]
public void Indicate_Selected_Category()
{
    Mock<IProductRepository> mock = new Mock<IProductRepository>();

    mock.Setup(m => m.Products).Returns(new Product[]
    {
        new Product{ Id = 1, Name = "P1", Category = "Apples"}, 
        new Product{ Id = 4, Name = "P2", Category = "Oranges"}, 
    });

    CategoryNav categoryNav = new CategoryNav(mock.Object);

    var categoryToSelect = "Appless";

    // How to get here ViewBag data ???
 //    var result = ((ViewViewComponentResult)categoryNav.Invoke(categoryToSelect)).

}

Но здесь есть проблема. Книга о классическом .NET MVC. И автор использует дочерние действия для создания фрагментов, таких как боковая панель с некоторой внутренней логикой. Но .NET Core не содержит эту концепцию.

Автор предлагает следующую строку для получения данных ViewBag в тесте:

string res = objectOfController.<name_of_childe_action>.ViewBag.<data_that_I_need>

Конечно, он не работает с новой концепцией View Components.

Так что мой вопрос следующий. Как получить значение ViewBag в некотором коде (не в представлении, а в модульном тесте, например), если я использую экземпляр View Component, а не контроллер.

1 Ответ

1 голос
/ 01 июля 2019

Несколько мест, которые вы можете проверить.

ViewBag ViewComponent после вызова

//...

//Act
categoryNav.Invoke(categoryToSelect);

// Assert
Assert.AreEqual(categoryToSelect, categoryNav.ViewBag.SelectedCategory);

ViewData ViewComponent после вызова

//...

//Act
categoryNav.Invoke(categoryToSelect);

// Assert    
Assert.AreEqual(categoryToSelect, categoryNav.ViewData["SelectedCategory"]);

Или то же самое для результата просмотра

//...

//Act
var result = (ViewViewComponentResult)categoryNav.Invoke(categoryToSelect);

// Assert    
Assert.AreEqual(categoryToSelect, result.ViewData["SelectedCategory"]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...