Problem wynikł w trakcie przerabiania książki "Asp.NET MVC 5 Zaawansowane Programowanie" rozdział 7. Zależało mi na czasie i to zignorowałem, teraz jednak wracam do problemu i dalej nie wiem jak to rozwiązać.
Rozpisałem kod testujący pracę kontrolera wywołującego dane zwracane do widoku. Wyjątek następuje jedynie przy uruchamianiu testu, sama aplikacja działa bez problemu. Poniżej szczegóły:
Model (4 oddzielne pliki):
public class Product
{
public int ProductID { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public decimal Price { get; set; }
public string Category { get; set; }
}
public interface IProductRepository
{
IEnumerable<Product> Products { get; }
}
public class PagingInfo
{
public int TotalItems { get; set; }
public int ItemsPerPage { get; set; }
public int CurrentPage { get; set; }
public int TotalPages
{
get { return (int)Math.Ceiling((decimal)TotalItems / ItemsPerPage); }
}
}
public class ProductsListViewModel
{
public IEnumerable<Product> Products { get; set; }
public PagingInfo PagingInfo { get; set; }
public string CurrentCategory { get; set; }
}
Kontroler:
private IProductRepository repository;
public int PageSize = 4;
public ProductController(IProductRepository productRepository)
{
this.repository = productRepository;
}
public ViewResult List( int page = 1)
{
ProductsListViewModel model = new ProductsListViewModel
{
Products = repository.Products
.OrderBy(p => p.ProductID)
.Skip((page - 1) * PageSize)
.Take(PageSize),
PagingInfo = new PagingInfo
{
CurrentPage = page,
ItemsPerPage = PageSize,
TotalItems = repository.Products.Count()
}
};
return View(model);
}
Test:
[TestMethod]
public void Can_Paginate()
{
//przygotowanie
Mock<IProductRepository> mock = new Mock<IProductRepository>();
mock.Setup(m => m.Products).Returns(new Product[]
{
new Product {ProductID = 1, Name = "P1" },
new Product {ProductID = 2, Name = "P2" },
new Product {ProductID = 3, Name = "P3" },
new Product {ProductID = 4, Name = "P4" },
new Product {ProductID = 5, Name = "P5" }
});
ProductController controller = new ProductController(mock.Object);
controller.PageSize = 3;
//działanie
ProductsListViewModel result = (ProductsListViewModel)controller.List(2).Model;
//aseracje
Product[] prodArray = result.Products.ToArray();
Assert.IsTrue(prodArray.Length == 2);
Assert.AreEqual(prodArray[0].Name, "P4");
Assert.AreEqual(prodArray[1].Name, "P5");
}
Komunikat błędu:
Test Name: Can_Paginate
Test FullName: SportsStore.UnitTests.UnitTest1.Can_Paginate
Test Source: D:\visual studio projekty\SportsStore\SportsStore.UnitTests\UnitTest1.cs : line 22
Test Outcome: Failed
Test Duration: 0:00:00,4558873
Result StackTrace:
at System.Web.Mvc.BuildManagerViewEngine..ctor(IViewPageActivator viewPageActivator, IResolver`1 activatorResolver, IDependencyResolver dependencyResolver, VirtualPathProvider pathProvider)
at System.Web.Mvc.WebFormViewEngine..ctor(IViewPageActivator viewPageActivator)
at System.Web.Mvc.WebFormViewEngine..ctor()
at System.Web.Mvc.ViewEngines..cctor()
--- End of inner exception stack trace ---
at System.Web.Mvc.ViewEngines.get_Engines()
at System.Web.Mvc.Controller.View(String viewName, String masterName, Object model)
at SportsStore.WebUI.Controllers.ProductController.List(String category, Int32 page) in D:\visual studio projekty\SportsStore\SportsStore.WebUI\Controllers\ProductController.cs:line 30
at SportsStore.UnitTests.UnitTest1.Can_Paginate() in D:\visual studio projekty\SportsStore\SportsStore.UnitTests\UnitTest1.cs:line 33
Result Message:
Test method SportsStore.UnitTests.UnitTest1.Can_Paginate threw exception:
System.TypeInitializationException: The type initializer for 'System.Web.Mvc.ViewEngines' threw an exception. ---> System.MissingMethodException: Method not found: 'Void System.Web.WebPages.FileExistenceCache..ctor(System.Func`1<System.Web.Hosting.VirtualPathProvider>, Int32)'.
Wygląda na to, że problem następuje w momencie kompilowania kodu wywołującego metodę List. Jednak nie wiem czemu, wywala to cały test. Sama aplikacja działa bez problemu, IDE zaś nie podkreśla mi żadnych błędów składniowych.