Powiedzmy, że masz 2 warstwy rozwiązanie
MyApp.Web
MyApp.Data
W swojej warstwie danych trzeba będzie coś takiego:
public class ProductsRepository : IProductsRepository
{
public List<Product> GetAll()
{
//EF stuff
return _dbcontext.Products;
}
}
gdzie IProductsRepository to
public interface IProductsRepository
{
List<Product> GetAll();
}
W MyApp.Web trend polega na tym.
public class ProductsController : Controller
{
private readonly IProductsRepository _productsRepository;
public ProductsController(IProductsRepository productsRepository)
{
_productsRepository = productsRepository;
}
public ActionResult Index(int page=1)
{
var allProducts = _productsRepository.GetAll();
return View(allProducts)
}
}
Kto umieszcza w ProductsRepository do konstruktora w czasie wykonywania? Ludzie używają wtrysku zależności takich jak Ninject frameworków do tego. Ale dlaczego? Bo to pozwala im na podróbkę ProductsRepository i jak to
public class FakeProductsRepository : IProductsRepository
{
public List<Product> GetAll()
{
return new List<Product>
{
new Product { Name = "PASTE" }
new Product { Name = "BRUSH" }
},
}
}
a następnie testów jednostkowych, regulator jak ten
[TestMethod]
public void IndexGetsAllProducts()
{
//Arrange
var fakeProductRepo = new FakeProductsRepository();
var productsController = new ProductsController(fakeProductRepo);
//Act
var result = productsController.Index(1) as ViewResult;
//Assert
var model = result.Model as List<Product>;
Assert.AreEqual(2, model.Count);
}
istocie jesteś udaje bazę więc test jednostka jest szybko i niezależnie od bazy danych. Czasami, aby udawać ludzi, używaj modelu do szyderstwa:, takiego jak Moq, który zasadniczo robi to samo.
Jeśli chcesz przetestować produkt ProductsRepository, to nie jest już nazywany testem jednostkowym, ponieważ zależy od zewnętrznego źródła. Aby przetestować te, w zasadzie testujesz Entityframework.
W połączeniu z testami jednostkowymi ludzie przeprowadzają testy integracyjne za pomocą struktur takich jak Specflow. Zasadniczo można utworzyć instancję Controler produktów za pomocą rzeczywistego produktu ProductsRepository i sprawdzić wyniki wracające.
Tylko dla FYI: Są one nazywane ogólnie testami integracyjnymi. Jeśli były to testy jednostkowe, to uderzałbyś "Run Tests .." co 30 sekund (tak jak powinieneś być w TDD), a objazd do bazy danych dla każdego testu sprawiłby, że twoje testy przebiegałyby przez minuty/godziny. Testy integracyjne, które faktycznie integrują się z innymi systemami, są uruchamiane przed wydaniem. –
@SimonWhitehead: dlaczego używamy wzorca repozytorium, czy jest to potrzebne i jaka jest różnica między udawaniem i fałszowaniem? – neel
* Po tym chcę przetestować operacje CRUD * Chcesz przetestować swoją logikę związaną z operacjami CRUD lub chcesz przetestować struktura podmiotu? –