Я пытаюсь переложить книгу Адама Фримена "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);
}
}
Это создаст что-то вроде боковой панели с фильтром категорий (это слева):
Я собираюсь выделить текущую категорию. Но я хочу создать тест раньше.
Тест предназначен для определения того, выделена кнопка категории или нет.
[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, а не контроллер.