ASP.Net MVC - Что делают Mocks? - PullRequest
       3

ASP.Net MVC - Что делают Mocks?

0 голосов
/ 14 августа 2011

Я новичок в ASP.Net MVC - я читаю книгу MVC и следующую нумерацию тестов кода в примере приложения в книге:

[TestMethod]
public void Can_Paginate()
{
    // Arrange
    // - create the mock repository
    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"}
                                                      }.AsQueryable());
    // create a controller and make the page size 3 items
    ProductController controller = new ProductController(mock.Object);
    controller.PageSize = 3;
    // Action
    IEnumerable<Product> result = (IEnumerable<Product>)controller.List(2).Model;
    // Assert
    Product[] prodArray = result.ToArray();
    Assert.IsTrue(prodArray.Length == 2);
    Assert.AreEqual(prodArray[0].Name, "P4");
    Assert.AreEqual(prodArray[1].Name, "P5");
}

Вопрос в том, что делает Mock? я не могу передать массив Product в ProductController напрямую? почему этот раунд?

Ответы [ 3 ]

3 голосов
/ 14 августа 2011

Понятия Mocks и их аналоги, заглушки, используются при тестировании приложений. В этом случае они используются для настройки поддельных данных, которые контроллер может использовать для проверки своего поведения. Понятие Mocks и Stubs может быть сложным, чтобы заставить вас задуматься.

Попробуйте прочитать эту статью Мартина Фаулера под названием Насмешки - это не заглушки . При модульном тестировании вы не хотите делать вызовы в базу данных или файловую систему (или это будут интеграционные тесты), поэтому мы высмеиваем вызов внешней зависимости

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

0 голосов
/ 14 августа 2011

В основном имитация имитирует экземпляр класса, который реализует IProductRepository, путем введения прокси под капотом, который имеет те же методы и свойства, которые определены в базовом интерфейсе.

Следующая строка результатов настройки кода, которая будет возвращена, как только будет вызван метод доступа к свойству Products.

mock.Setup(m => m.Products).Returns(...);

Относительно ProductController, Я полагаю, что его конструктор имеет аргумент типа IProductRepository, поэтому для создания экземпляра ProductController и его проверки необходимо создать экземпляр класса, который реализует IProductRepository и передать его в конструктор контроллера, насмешка над IProductRepository позволяет вам сосредоточиться на тестировании контроллера и не заботиться о каких-либо деталях реализации IProductRepository. Пересмешка - это правильный способ симулировать зависимости класса в тесте, имея в руках только интерфейс. Итак, вы тестируете ProductController и все зависимости проверяются.

0 голосов
/ 14 августа 2011

Похоже, что он использует mocking API (возможно, Moq) для создания макетной реализации этого интерфейса для целей тестирования. Это полезно, потому что иногда реальные объекты выполняют такие вещи, как подключение к базам данных или другим ресурсам, которые не способствуют тестированию.

http://code.google.com/p/moq/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...