Как включить модульные тесты в модуль ruby? - PullRequest
5 голосов
/ 01 декабря 2009

Я пытаюсь включить модульные тесты для модуля в тот же исходный файл, что и сам модуль, следуя модели Perl modulino .

#! /usr/bin/env ruby

require 'test/unit'

module Modulino
    def modulino_function
        return 0
    end
end

class ModulinoTest < Test::Unit::TestCase
    include Modulino
    def test_modulino_function
        assert_equal(0, modulino_function)
    end
end

Теперь я могу запустить модульные тесты, выполняющие этот исходный файл.

Но , они также запускаются, когда мне требуется / загружает их из другого скрипта. Как этого можно избежать?

Есть ли более идиоматический способ добиться этого с помощью Ruby, если эта практика не поощряется?

Ответы [ 4 ]

11 голосов
/ 01 декабря 2009

Лично я никогда не слышал, чтобы кто-нибудь пытался сделать это в 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

3 голосов
/ 01 декабря 2009

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

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

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

2 голосов
/ 27 сентября 2013

Вы можете включить модульные тесты в сам исходный код модуля, используя minitest.

Попробуйте этот пример:

class Foo < String
end

if $0 == __FILE__
    require 'minitest/autorun'
    require 'minitest/pride'

    class FooTest < MiniTest::Unit::TestCase
        def test_foo_instantiation
            foo = Foo.new()
            assert_instance_of Foo, foo
        end

        def test_foo_parent_class
            foo = Foo.new()
            assert_kind_of String, foo
        end
    end
end

Здесь я создал класс с именем Foo, который наследуется от класса String. Затем я создал два модульных теста. В первом тесте я проверяю, могу ли я создать экземпляр объект класса Foo. Во втором тесте я проверяю, является ли объект класса Foo типом String.

Если этот код записан в файле с именем foo.rb, я могу просто запустить тесты с помощью этой команды:

ruby foo.rb

Minitest быстро выполняется. Модуль "гордости" позволяет выводить результаты теста в цветных шрифтах, что приятно на глаз.

1 голос
/ 02 декабря 2009

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

В сочетании с трюком samg (еще раз спасибо), мы можем написать:

if (__FILE__ != $0)
    Test::Unit.run = true  ### do not run the unit tests
end
...