Тестовые контроллеры или BusinessModel? - PullRequest
1 голос
/ 22 июля 2009

После прочтения первых 7 глав Pro ASP.NET MVC Framework - очень рекомендуемое чтение, я бы сказал. На протяжении всего моего чтения автор - Стив Сандерсон , много касался некоторых практик TDD. Теперь мой вопрос:
Стив выполнял свои юнит-тесты на самих контроллерах, пример книги:

[Test]
    public void List_Includes_All_Products_When_Category_IsNull() {
        //Arrange: 
        IProductsRepository repository = MockProductsRepository(
            new Product { Name = "First Product", Category= "Cat11"}, 
            new Product { Name = "SecondProduct", Category = "Cat22" } 
        );
        ProductsController controller = new ProductsController(repository);
        controller.PageSize = 10;

        //Act: 
        var result = controller.List(null, 1);

        //Assert: 
        Assert.IsNotNull(result, "Didn't render view!");
        var model = controller.ViewData.Model as IList<Product>;
        Assert.AreEqual(2, model.Count, "Got wrong number of products!");
        Assert.AreEqual(model[0].Name, "First Product", "Not the expected first item.");
        Assert.AreEqual(model[1].Name, "SecondProduct", "Not the expected second item.");           
    }

Я понимаю, почему Стив это тестирует, очевидно, ему нужно проверить свою логику по установленным им флагам ViewData, поэтому ему нужно вызвать действие контроллера List, мой вопрос: достаточно ли этого? Я имею в виду, не следует ли сначала проверить его объекты Model? Стив использует LINQ2SQL в качестве своего инструмента ORM, и он практически не использует ничего, кроме функциональности LINQ, я имею в виду, что пример только выбирает данные и обновляет их, вызывая встроенные методы LINQ; нет проверки бизнеса. В моем реальном приложении необходимо выполнить множество бизнес-проверок, будет ли достаточно (или, скорее, проще) для меня начать тестирование на уровне контроллера, игнорируя мои классы Model (потому что я не думаю, что это хорошая идея)?
Жду ваших идей, Гас!

1 Ответ

1 голос
/ 22 июля 2009

Думаю, вам понадобятся отдельные тесты для бизнес-логики в дополнение к тестам контроллера.

Я организую свои тесты контроллера так же, как Стив. В основном, учитывая условие, содержит ли мой контроллер ожидаемые данные просмотра? Вот и все. Нет утверждений о внутренних деталях данных или любой другой бизнес-логике - все это содержится в отдельных тестах.

Следуя вашему примеру, я бы оставил это в ваших тестах на контроллере и допустим, что у вас есть некоторая бизнес-логика, предотвращающая отрицательные цены, у вас может быть отдельный тест для таких вещей, как "Product_discount_does_not_result_in_negative_price ()", который не связан с веб-контекст и контроллер. Допустим, в вашем классе Product у вас есть правило, согласно которому его цена составляет минимум 1 доллар, даже если некоторая так называемая скидка на самом деле превышает действительную цену по умолчанию: (ужасный пример, извините!)

[Test]
Product_discount_does_not_result_in_negative_price() {
    Product p = new Product {price = 5, discount = 10};
    Assert.IsTrue(p.price == 1); //expecting the price Get() to return 1 in this case
}

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

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