Ответ 1
Допустим, у вас есть двухслойное решение
MyApp.Web
MyApp.DataSTRONG >
В вашем слое данных у вас будет что-то вроде этого:
public class ProductsRepository : IProductsRepository
{
public List<Product> GetAll()
{
//EF stuff
return _dbcontext.Products;
}
}
где IProductsRepository -
public interface IProductsRepository
{
List<Product> GetAll();
}
В MyApp.Web это делается.
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)
}
}
Кто вкладывает ProductsRepository в конструктор во время выполнения? Для этого используются инъекции зависимостей, например Ninject. Но почему? Поскольку это позволяет им подделывать ProductsRepository и как это
public class FakeProductsRepository : IProductsRepository
{
public List<Product> GetAll()
{
return new List<Product>
{
new Product { Name = "PASTE" }
new Product { Name = "BRUSH" }
},
}
}
а затем UNIT TEST контроллер, подобный этому
[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);
}
По существу, вы подделываете базу данных, поэтому unit test работает быстро и независимо от базы данных. Иногда для подделки люди используют mocking framework как Moq, что по сути делает то же самое.
Если вы хотите протестировать ProductsRepository, то он больше не называется unit test, потому что он зависит от внешнего источника. Чтобы проверить те, вы по существу проверяете Entityframework.
В сочетании с модульными тестами люди проводят тестирование интеграции с использованием таких фреймворков, как Specflow. По существу вы можете создать Productcontroller с помощью реального ProductsRepository и проверить результаты.