Тестирование сложного метода - PullRequest
5 голосов
/ 30 ноября 2011

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

def play_game
    puts @gui.intro

    while(game_over? == false)
      message = nil
      @gui.render_board(@board)
      @gui.move_request
      player_input = gets 
      coordinates = UserInput.translate_move_request_to_coordinates(player_input) 

      message = MoveCheck.move_validator(coordinates[0], coordinates[1], coordinates[2], coordinates[3])
      puts message unless (message.nil? or message == "jumping move")
      if(message == nil or message == "jumping move")
        @current_player = switch_player unless (message == "jumping move" and jump_available? == true)
      end
    end
    puts @gui.display_game_ending_message  
  end

Так, как я могу проверить это (используя RSpec) или мне не следует беспокоиться об этом и действительно о моем всестороннем тестировании?

Ответы [ 2 ]

6 голосов
/ 30 ноября 2011

Все, что play_game действительно делает, это запускает игровой цикл. Что вы действительно хотите проверить, так это то, что происходит внутри игрового цикла. Самый простой способ сделать это - разбить содержимое игрового цикла на более легко тестируемые методы.

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

4 голосов
/ 30 ноября 2011

Я бы переместил весь код внутри , в то время как -loop, в отдельный метод.Таким образом, вы можете легко протестировать его, введя в него различные старые игровые состояния в качестве входных данных и проверив, что они успешно обработаны (чтобы получить new игровое состояние).Обратите внимание, что код, который следует принципам функционального программирования, проще тестировать (new_state = process(old_state)), но в любом случае вы все равно можете проводить тестирование как есть, проверяя, обновляется ли @gui так, как вы ожидаете, учитывая предыдущее состояние.

Ваш основной метод play_game теперь будет таким простым:

def play_game
  process(@gui) until game_over?
end

[править] Позвольте мне показать реальный пример.Чтобы поиграть с Raphael.js и CoffeeScript, я написал движок Reversi ( reversi.coffee и здесь spec ).Код основного цикла в вашем вопросе здесь изолирован функцией без сохранения состояния: move.Так что я могу сделать new_state = move(old_state) и протестировать его со всеми парами * old_state * / * Ожидаемое_новое_статы * Я считаю нужным.

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