2009-11-18 5 views
2

У меня возникла проблема при попытке протестировать модуль с помощью Test :: Unit. То, что я имел обыкновение делать это:Испытательные модули с тестом :: Unit

my_module.rb:

class MyModule 
    def my_func 
    5 # return some value 
    end 
end 

test_my_module.rb:

require 'test/unit' 
require 'my_module' 

class TestMyModule < Unit::Test::TestCase 
    include MyModule 

    def test_my_func 
    assert_equal(5, my_func) # test the output value given the input params 
    end 
end 

Теперь проблема, если my_module объявляет метод инициализации, он получает включены в тестовый класс, и это вызывает куча проблем, поскольку Test :: Unit, похоже, переопределяет/генерирует метод инициализации. Так что мне интересно, что является лучшим способом протестировать модуль?

Мне также интересно, что мой модуль должен стать классом в этот момент, поскольку метод инициализации предназначен для инициализации состояния чего-то. Мнения?

Заранее благодарен!

+0

Если 'MyModule' - это класс, то' include MyModule' поднимет 'TypeError'. Вы сбиваете с толку классы и модули? –

ответ

3

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

перечислимых является отличным примером, до тех пор, как вы определяете [], и каждый, когда вы включаете перечислимых вы вдруг получаете поп, толчок и т.д.

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

4

В том числе метод initialize в модуле чувствует себя очень неправильно для меня, поэтому я бы пересмотрел это как минимум.

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

class TestClass 
    include MyModule 
end 

class TestMyModule < Unit::Test::TestCase 
    def setup 
    @instance = TestClass.new 
    end 

    def test_my_func 
    assert_equal(5, @instance.my_func) # test the output value given the input params 
    end 
end 
+2

Аналогичным образом, но более компактно, мы используем @instance = Class.new {include MyModule} .new – Kyle