是否可能和/或建议在 Rails 中动态生成测试?

Bry*_*ard 6 testing unit-testing ruby-on-rails

我发现在 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
Run Code Online (Sandbox Code Playgroud)

既然人们已经验证了这可能有用,那么我应该在哪里放置这样的代码块,以便它只能执行一次来创建这些测试?

eri*_*rik 3

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
Run Code Online (Sandbox Code Playgroud)