Тестовые модули с Test :: Unit - PullRequest
2 голосов
/ 18 ноября 2009

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

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

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

Ответы [ 2 ]

4 голосов
/ 19 ноября 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
3 голосов
/ 19 ноября 2009

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

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

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

...