Как проверить код, который использует системные команды - PullRequest
3 голосов
/ 16 марта 2011

Я пишу простую библиотеку, которая проверяет, что MySQL-сервер жив и зависит от результатов, он делает другие вещи.Чтобы проверить соединение, я использую такой код:

def check_connection
  result = if @password
    `mysqladmin -u#{@username} -p#{@password} ping`
  else 
    `mysqladmin -u#{@username} ping` 
  end
  parse_result(result)
end

Как проверить этот метод?Я думаю, я не должен подключаться к серверу mysql во время теста.Единственная идея, которую я имею, состоит в том, чтобы вернуть в один метод соответствующую строковую команду для проверки связи (зависит от использования пароля) и использовать ее в таком методе, как:

def check_connection(ping_string)
  `#{ping_string}`
end

и в каждом тесте только макетировать этот метод, таким образом, только этот методиспользуйте команду.

Что бы вы сделали, чтобы проверить это правильно?

Ответы [ 2 ]

1 голос
/ 16 марта 2011

Вы можете придерживаться своего исходного кода и подойти к нему так:

  1. Убедитесь, что parse_result является модульным испытанием.
  2. Макет check_connection, чтобы остальные тесты не заканчивались вызовом mysqladmin.

Есть дыра в том, что соединение с MySQL не проверяется, но я не думаю, что это имеет большое значение. Тестирование ping_string на самом деле не закроет эту дыру, и, учитывая, что вызов mysqladmin в основном жестко запрограммирован, ваш риск здесь мал.

0 голосов
/ 25 марта 2011

Если вы используете команду system вместо обратных галочек (``), вы можете заглушить это в своих тестах.Допустим, у вас есть этот класс:

class Thing
  def check_connection
    result = system "some command"
    parse_result result
  end
end

В вашем тесте (и я буду использовать синтаксис rspec для иллюстрации) вы можете протестировать его следующим образом:

it 'should check the connection' do
  thing = Thing.new
  thing.should_receive(:system).and_return "some result"

  thing.check_connection
  # whatever checking you want to make with the parse_result method
end

Это работаетпотому что обычно системный метод передается до Kernel#system, что делает реальный системный вызов.В этом тесте вы позволяете вашему экземпляру Thing отвечать на системный метод с некоторым выводом, который вы можете ожидать от реального вызова.

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