Тестовые модули с Test :: Unit

Я столкнулся с проблемой при попытке протестировать модуль с помощью Test :: 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, похоже, переопределяет / генерирует метод инициализации. Итак, мне интересно, как лучше всего протестировать модуль?

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

Заранее спасибо !


person Sylvain Prat    schedule 18.11.2009    source источник
comment
Если MyModule является классом, тогда include MyModule поднимет TypeError. Вы путаете классы и модули?   -  person Andrew Grimm    schedule 30.09.2010


Ответы (2)


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

Enumerable - отличный пример, если вы определяете [] и каждый раз, когда вы включаете Enumerable, вы внезапно получаете pop, push и т. Д.

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

person Chuck Vose    schedule 18.11.2009

Мне кажется неправильным включение метода 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
person Steve Madsen    schedule 18.11.2009
comment
Точно так же, но более компактно, мы используем @instance = Class.new {include MyModule} .new - person Kyle; 20.11.2009