是否有可能和/或建议在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。 除了通常更好,它使你正在做的事情变得更容易。