Дразня метод Контроллера для тестирования слоя представления - PullRequest
3 голосов
/ 16 декабря 2011

Я хочу протестировать слой представления .

У меня есть контроллер с методом

class Controller ... {
public void do() {

  List<String> data = ....

  render(data);
}
..
}

У меня есть тест веб-драйвера (функциональные тесты), который тестируетчто данные могут отображаться в виде списка на странице.

Итак, как я могу издеваться над методом do () в контроллере PlayFramework, чтобы не зависеть от реальных данных, которыеполучать откуда-то?Какой общий подход?Как игра узнает / будет использовать метод этого контроллера, если он будет издеваться в каком-то конкретном тесте ..?

- добавлено после получения некоторых комментариев (thx):

Я просто хочу проверитьпосмотреть, когда контроллер вернет некоторые данные обратно.

Но логика моего контроллера еще не готова, я просто знаю, что он вернет список , и в представлении мне нужно показать эти строки в

HTML-элементы.Вот и все.

Я ничего не знаю - как бы я реализовал мой Контроллер, где он использовал бы базу данных или веб-сервисы для возврата данных обратно в представление (вот почему я не могу ничего посмеяться внутри моего контроллера ... скажем, Http.get () .. или Database.get ()) ..

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

Ответы [ 3 ]

3 голосов
/ 18 декабря 2011

Создание интерфейса с методом для получения ваших данных.

public interface DataProvider {
    public List<String> getData();
}

Для тестирования вы можете реализовать этот интерфейс с классом, предоставляющим некоторые значения теста.

public class MockDataProvider implements DataProvider {
    public List<String> getData() {
        String[] testData = {"a","b","c"};
        return Arrays.asList(testData);
    }
}

Позже, когда вы узнаете, откуда вы берете свои данные (база данных, веб-запрос и т. Д.), Вы просто снова реализуете свой интерфейс.

public class WebProvider implements DataProvider {
    public List<String> getData() {
        ... WS.url("http://service.example.com").get();
        // fetch the data
        return dataList;
    }
}

И в вашем контроллере выможет переключаться независимо от того, находитесь ли вы в тестовом режиме или нет.

class MyController ... {
    public static void datalist() {
        DataProvider provider;

        if (Play.runingInTestMode()) {
            provider = new MockDataProvider();
        } else {
            provider = new WebProvider();
        }

        List<String> data = provider.getData();
        render(data);
    }
}
1 голос
/ 16 декабря 2011

Я ничего не знаю о PlayFramework, но это распространенный вопрос, который возникает при модульном тестировании MVC.В целом, у вас есть «функциональные» или интеграционные тесты, которые проверяют, работает ли все это, и модульные тесты для ваших моделей.Помимо того, что вы хотите 100% покрытия кода, вам нужно спросить себя, нужно ли вам на самом деле тестировать этот код.

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

0 голосов
/ 16 декабря 2011

Если вы хотите проверить свой слой представления, используйте Selenium. Предоставляется Play.

Также вы можете использовать специальную базу данных для тестов.

Не пытайтесь издеваться над контроллером: используйте базу данных в памяти (очень быстро) и загружайте в нее данные для ваших тестов.

Добавить после обновления:

Возможно, вы могли бы жестко закодировать список, пока не разработаете контроллер.

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