是否有可能和/或建议在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 

现在人们已经证实这可能是有用的,我会在哪里放置一段这样的代码,以便它只执行一次,只创建一次这些测试?

DRY原则适用于测试代码,与应用程序代码一样多。

使用一种方法生成所有这些测试应该可以更容易地validation测试是否正确。

回答评论(注意:我有一段时间没有写过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 

通常,单独编写测试。 但是,如果你有一堆相同的测试,我认为从each块中生成each块都没有错。

额外提示:使用RSpec,而不是Test :: Unit。 除了通常更好,它使你正在做的事情变得更容易。