Возможно ли и / или целесообразно ли динамически генерировать тесты в рельсах? - PullRequest
3 голосов
/ 16 июля 2009

Одна хитрость, которую я нашел очень полезной в прикладном программировании на rails, заключается в том, что class_eval можно использовать для создания методов на лету. Сейчас я начинаю тестирование, и мне интересно, можно ли использовать аналогичную идею для генерации тестов.

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

Рекомендуется ли этот тип тестирования, или я должен просто придерживаться индивидуальной проверки? Если это так, как можно поступить так?

РЕДАКТИРОВАТЬ: Это может выглядеть примерно так:

actions = {:index => :get,:show => :get,:edit => :get,:update => :put}
actions.each_pair do |action,type|
  class_eval(%Q{def test_user_required_for_#{action}
      set_active_user users(:one)
      #{type} :#{action}
      assert flash[:error]
      assert_redirected_to :action => :index
    end
  })
end

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

Ответы [ 2 ]

3 голосов
/ 16 июля 2009

Принцип DRY применяется к тестовому коду так же, как и к коду приложения.

Наличие одного метода для генерации всех этих тестов должно упростить проверку правильности теста в первую очередь.

Чтобы ответить на комментарий (примечание: я давно не писал тестовый код Rails, поэтому он, вероятно, не на 100% правильный). Все, что между %| | - это одна большая строка:

MyControllerTest

  [:index, :show, :new, :create, :edit, :update, :destroy].each do |action|
      class_eval do %|
        test "#{action} requires before filter" do
          #test #{action} code here
        end
      |
  end

end
0 голосов
/ 02 ноября 2011

В общем, пишите свои тесты индивидуально. Однако, если у вас есть несколько идентичных тестов, я не вижу ничего плохого в том, чтобы генерировать каждый из таких блоков each, как у вас.

Бонусный совет: используйте RSpec, а не Test :: Unit. Помимо того, что он в целом приятнее, он делает все, что вы делаете, намного проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...