Генерация многих почти идентичных юнит-тестов ruby - PullRequest
1 голос
/ 24 августа 2010

У меня есть несколько файлов ruby ​​(a.rb, b.rb, c.rb), которые определяют очень похожие классы.(Они должны проверять одно и то же)

Я написал модульный тест для тестирования этих подклассов и сгенерировал контексты для каждого из классов программно (см. Ниже) - вместо этого я должен вместо этого программно создать целые классы тестирования?Если да, то почему и как?

Я использую shoulda расширения для модульного теста, поэтому мои файлы выглядят примерно так:

a.rb

class ItsA
  def number
    1123
  end
end

b.rb

class ItsB
  def number
    6784
  end
end

test_letters.rb

require 'rubygems'
require 'test/unit'
require 'shoulda'

class LettersTest < Test::Unit::TestCase
  Dir.glob('letters/*.rb') do |letter|
    context "The #{letter} letter file"
      setup do
        # Here I require the ruby file and allocate
        # @theclass to be an instance of the class in the file.
        # I'm actually testing JavaScript using Harmony, but 
        # putting those details in might complicate my question.
      end

      should "return a number" do
        assert @theclass.number.is_a? Number
      end
    end
  end

Это делает работу достаточно хорошо, но должнаЯ делаю некоторые другие jiggerypokery и автоматически создаю LetterATest, LetterBTest и т. Д. Вместо этого?Если так, как бы вы поступили и почему?

1 Ответ

1 голос
/ 25 августа 2010

Это действительно зависит от того, насколько похожи ваши классы, но, если они в значительной степени идентичны и требуют нескольких небольших тестов, а вы используете musta, вы можете сделать что-то вроде:

class LettersTest < Test::Unit::TestCase
  context "The letter classes"
    setup do
      @instances = # your code to get a list of the instances
    end

    should "return a number" do
      @instances.each do |instance|
        assert instance.number.is_a?(Number), "#{instance.class}.number should be a number"
      end
    end
  end
end

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

...