Dart Как провести модульное тестирование простой функции

Мне нравится, что в Dart можно писать чистый и лаконичный код, но, похоже, Dart — один из тех языков, которые легко написать, но трудно протестировать!

Например, учитывая следующий довольно простой метод, как его провести модульное тестирование?

typedef void HandleWebSocket(WebSocket webSocket);

Router createWebSocketRouter(HttpServer server, String context, HandleWebSocket handler) {

  var router = new Router(server);

  router.serve(context).transform(new WebSocketTransformer()).listen(handler);

  return router;
}

Вам нужно каким-то образом заменить new Router() каким-то фабричным методом, который возвращает макет. Затем макет должен вернуть макет при вызове serve. Затем для этого должен быть метод фиктивного преобразования *, который возвращает фиктивный поток ... и в этот момент большинство людей сдадутся!

Мне удалось написать модульный тест, используя описанный выше подход, но, поскольку он потребовал 80 нечетных строк и загрязнил фактический класс фабричным методом, я вряд ли могу сказать, что доволен этим!

Есть ли лучший способ сделать это?


person richard    schedule 16.06.2014    source источник
comment
Есть аналогичный вопрос stackoverflow.com/questions/24224525 Возможно, есть также фиктивный класс для WebSocket.   -  person Günter Zöchbauer    schedule 16.06.2014
comment
Я использую тестирование этой процедуры как пример того, насколько сложным для меня оказалось тестирование Dart Unit. Является ли это признаком того, что в языке Dart или API чего-то не хватает?   -  person richard    schedule 16.06.2014
comment
Я бы не ожидал, что методы тестирования, использующие WebSocket (или другое подключение к внешним системам), будут простыми, особенно когда нет готовых к использованию фиктивных объектов. Если еще нет доступного фиктивного объекта, это то, что может отсутствовать. В остальном тестирование с дротиком - это нормально (ИМХО), но всегда есть что-то, что можно улучшить...   -  person Günter Zöchbauer    schedule 16.06.2014
comment
Что именно вы хотите проверить в этом методе?   -  person Günter Zöchbauer    schedule 16.06.2014
comment
Основной принцип TTD: никогда не пишите ни строчки производственного кода, пока у вас не будет проваленного теста. :) Но вы правы, тестировать API сложно.   -  person richard    schedule 17.06.2014
comment
Вы правы, но вы все равно должны подумать о том, что вы на самом деле пытаетесь протестировать. Если вы только тестируете функциональность API, это может не стоить времени.   -  person Günter Zöchbauer    schedule 17.06.2014
comment
В какой-то момент мне придется попробовать написать тест, который запустит сервер, а затем откроет для него веб-сокет. Поскольку я хочу написать модульный тест Dart для этого, я, несомненно, снова буду вас беспокоить :)   -  person richard    schedule 17.06.2014