Как включать модульные тесты в рубиновый модуль?

Одна вещь, которая еще не была затронута по некоторым причинам:

, Когда Вы видите алгоритмы с вещами как O (2^n) или O (n^3) или другие противные значения, это часто означает, что Вы оказываетесь перед необходимостью принимать несовершенное решение своей проблемы для получения приемлемой производительности.

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

Рассматривают шахматы: Я не знаю точно, чем считается правильное решение, но это - вероятно, что-то как O (n^50) или еще хуже. Для любого компьютера теоретически невозможно на самом деле вычислить корректный ответ - даже при использовании каждой частицы во вселенной как вычислительный элемент, выполняющий операцию в минимальное возможное время для жизни вселенной, Вы все еще имеете много в запасе нулей. (Может ли квантовый компьютер решить его, другой вопрос.)

5
задан Andrew Grimm 2 December 2011 в 02:08
поделиться

3 ответа

Лично я никогда не слышал, чтобы кто-то пытался сделать это в Ruby. Это определенно не стандартная практика. Тем не менее, вы можете воспользоваться этим трюком:

if __FILE__ == $0
  # Do something.. run tests, call a method, etc. We're direct.
end

Код в блоке if будет выполняться только в том случае, если файл выполняется напрямую, а не в том случае, если это требуется другой библиотекой или приложением.

Подробнее рубиновые уловки здесь: http://www.rubyinside.com/21-ruby-tricks-902.html

11
ответ дан 18 December 2019 в 09:50
поделиться

На самом деле это не так уж и редко в Ruby, хотя, конечно, это не обычная практика в Rails.

Одна из проблем, с которой вы можете столкнуться, та же, что и в этом сообщении , а именно: модули действительно должны быть включены в классы для их тестирования. Конечно, можно протестировать модуль, включив его в свой тестовый пример, но вы проверяете, работает ли модуль при смешивании с Test :: Unit :: TestCase, а не то, что он будет работать, когда вы смешаете его с чем-то более полезным.

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

3
ответ дан 18 December 2019 в 09:50
поделиться

Только что найден один способ предотвратить выполнение модульного теста, когда модуль требуется из сценария. В unit.rb в ... / lib / ruby ​​/ 1.8 / test / есть флаг для установки значения true.

В сочетании с уловкой samg (еще раз спасибо) мы можем написать:

if (__FILE__ != $0)
    Test::Unit.run = true  ### do not run the unit tests
end
1
ответ дан 18 December 2019 в 09:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: