Допустим, у вас есть два слоя раствора
MyApp.Web
MyApp.Data
В вашем слое данных вы будете иметь что-то вроде этого:
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" }
},
}
}
, а затем БЛОК 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);
}
По существу вы подделки базы данных поэтому тест чиллера быстро и независимо от базы данных. Иногда для фальсификации люди используют фальшивый каркас как Moq, который по сути делает то же самое.
Если вы хотите протестировать ProductsRepository, то он больше не называется модульным тестом, потому что он зависит от внешнего источника. Чтобы проверить те, вы по существу проверяете Entityframework.
В сочетании с модульными испытаниями люди проводят тестирование интеграции с использованием фреймворков, таких как Specflow. По существу, вы можете создать экземпляр Productscontroller с реальными ProductsRepository и проверить результаты.
Просто FYI: они обычно называются интеграционными испытаниями. Если бы они были Unit Tests .. вы бы нажимали «Run Tests ..» каждые 30 секунд (например, вы должны быть в TDD), и в оба конца базы данных для каждого теста ваши тесты будут выполняться в течение минут/часов. Интеграция. Тесты, которые фактически интегрируются с другими системами, запускаются до выпуска. –
@SimonWhitehead: так почему мы используем шаблон репозитория, это необходимо и в чем разница между шумом и фальсификацией? – neel
* После этого я хочу протестировать операции CRUD * Вы хотите протестировать свою логику, связанную с операциями CRUD, или вы хотите протестировать платформа Entity Framework? –