次のアクションがあります。
public ActionResult ProductList(int category)
{
IEnumerable<Product> productList = repository.Products.Where(p => p.CategoryId == category);
return PartialView("ProductList", productList);
}
public ActionResult CategoryList(int parentCategory)
{
IEnumerable<Category> categoryList = repository.Categories.Where(p => p.ParentCategoryId == parentCategory);
return PartialView("CategoryList", categoryList);
}
次の PartialViews を構築します。
@model POS.Domain.Entities.Product
<div class = "item">
<h3>@Model.Name</h3>
@Model.Description
@Model.Category.Name
<h4>@Model.Price.ToString("c")</h4>
</div>
@model POS.Domain.Entities.Category
<div class = "category" id= "@Model.CategoryId">
<h2>@Model.Name</h2>
<a href='/get-partial-view'>Get Products from the category: @Model.Name </a>
<div class="divResult">
</div>
</div>
次の単体テストでテストされます。
[TestMethod]
public void ProductListReturnsAppropriateProducts()
{
// Arrange - create a controller
var controller = new ProductController(_mockRepository.Object);
// Action
var result = (PartialViewResult) controller.ProductList(2);
// Assert
Assert.AreEqual(((IEnumerable<Product>) result.ViewData.Model).Count(), 2);
Assert.IsTrue(((IEnumerable<Product>) result.ViewData.Model).Count(o => o.Name == "P4") == 1);
}
[TestMethod]
public void CategoryListReturnsAppropriateCategories()
{
// Arrange - create a controller
var controller = new ProductController(_mockRepository.Object);
// Action
var result = (PartialViewResult) controller.CategoryList(2);
// Assert
Assert.AreEqual(((IEnumerable<Category>) result.ViewData.Model).Count(), 3);
Assert.IsTrue(((IEnumerable<Category>) result.ViewData.Model).Count(o => o.Name == "C4") == 1);
}
これはほぼ完全な重複です。DRYの原則 をより厳密に遵守する方法を学びたいと考えています。
私のアクションはほぼ同じことを行いますが、製品のリストを生成するために 1 つと、カテゴリのリストを生成するために 1 つ必要です。. . (これは最終的に、ユーザーがクリックしてそれらのカテゴリ内のすべての製品を表示できるカテゴリを一覧表示するページを生成するために使用されます)。
これらのほぼ重複するメソッドを、製品とカテゴリを適切に処理できる 1 つのメソッドに統合する方法が必要です。products
これらの 2 つの別個のアクションから、 と の両方を処理する 1 つのアクションに移行するにはどうすればよいcategories
ですか?