2010-07-15 1 views
1

Я пытаюсь развернуть свою голову, используя Nunit, Ninject, MVC2 и ADO.Net Entity Data Model.Тестирование модуля с помощью Nunit, Ninject, MVC2 и ADO.Net Entity Data Model

Предположим, у меня есть ProductController, создающий экземпляр класса SqlProductsRepository.

public class ProductsRepository : IProductsRepository 
{ 
    public MyDbEntities _context; 

    public ProductsRepository() 
    { 
     _context = new MyDbEntities(); 
    } 

    public IList<Product> GetAllProducts() 
    { 
     return (from p in _context.Products select p).ToList(); 
    } 
} 

public class ProductsController : Controller 
{ 
    public ActionResult ProductsList() 
    { 
     ProductsRepository r = new ProductsRepository(); 
     var products = r.GetAllProducts(); 

     return View(products); 
    } 
} 

Я хотел бы быть в состоянии выполнить модульное тестирование на ProductsRepository, чтобы обеспечить это возвращает правильные данные, но я не знаю, как написать класс Test.

Каждый учебник/документ, который я читал до сих пор, указывает мне на создание объекта Mock с использованием IProductsRepository, а затем на ввод и тестирование контроллера.

Кажется, мне обойти конкретную реализацию.

MyDbEntities происходит от ADO.Net Entity Data Model EDMX-

ответ

3

Вы точно право- насмешливый хранилище делает обход конкретной реализации. В этом-то и дело.

Единичные испытания - это не то же самое, что Функциональные тестирование. Ваш макет объекта можно настроить, чтобы вернуть то, что вы явно определяете, затем вы проверяете, чтобы постоянных входов от вашего макета до ожидаемых результатов.

+0

Хорошо, я с вами. Мое намерение заключалось в том, чтобы ввести представление db, чтобы заменить контекст, чтобы проверить сами методы репозитория. Неужели это не хорошо? –

+0

Вы могли бы это сделать, но это действительно то, над чем насмехается. Идея состоит в том, что вы хотите иметь охват для каждого основного пути вашего кода бизнес-логики, поэтому подключайте макет в каждом тесте, чтобы возвращать результаты, проверяющие эти пути. Это сделает ваши тесты маленькими и плотными. –

+0

Cheers. Наверное, у меня есть смесь в используемых терминах. Как я могу создать Mock для проверки хранилища? –

2

Это звучит, как вы, желающих создать интеграционный тест для ProductsRepository, а не модульного тестирования, так как вы будете испытывать по отношению к базе данных, так что вы можете проверить, что он дает вам нужные данные.

Это когда модульное тестирование контроллера, которое вы хотели бы высмеять ProductRepository.

В моих интеграционных тестов для ProductsRepository, я буду делать очевидные вещи, как

public void TestProductsRepository() 
{ 
    var context = new MyDbEntities(); 

    // add a new product 

    var products = context.GetAllProducts(); 

    // check products contains new product 
} 
+0

Я хотел бы испытать более сложные методы в репозитории, такие как: GetProductByBrandNameAndProductTypeAndProductName (строка брендовые, строка productTypeSysName, строка PRODUCTNAME) Чтобы обеспечить это возвращают правильные данные. Я думал, что это может быть действительный модульный тест. –

+0

Это определенно действительная вещь для тестирования, но я, вероятно, не буду описывать ее как единичный тест, потому что ваш репозиторий должен интегрироваться с Entity Framework, чтобы получить результат. –

+0

Вы бы все еще использовали nunit для этого? –

2

С двумя вашими классами (ProductsRepository, ProductsController) у вас должно быть два набора тестов. Один набор тестов для каждого класса.

Когда (единица) тестирует ProductController, вы должны издеваться над своими зависимостями (в данном случае IProductsRepository). Исключением конкретных реализаций зависимостей является точка.

Будет проведено совершенно другое множество (интеграционных) тестов для проверки того, что ProductRepository может попасть в базу данных и вернуть правильные данные. В этих интеграционных тестах вы не будете издеваться над чем-либо, поскольку то, что вы тестируете, является взаимодействием между реальным репозитаром реального с фактической базой .

Смежные вопросы