动态测试控制器中的每个方法

问题描述:

我有一个Ruby on Rails 3 admin_controller与默认的设置的CRUD,索引等方法。我想用rspec来测试每个这些特定的断言。动态测试控制器中的每个方法

response.should render_template("layouts/some_layout")或测试,它应该需要登录。

将该测试复制粘贴到每种方法的测试组中会产生大量重复。国际海事组织是没有意义的有一个

it 'should require login' do 

重复几遍没有那个测试。

有没有简单的方法在方法列表上运行测试?说某种defined_methods.each do |method| it 'should' ....

这是一个很好的方法吗?或者我是否首先采取了错误的路线?

如果你想下去控制器中的反复测试每个公有方法的路线,你可以这样做:

SomeController.public_instance_methods(false).each do |method| 
    it "should do something" 
end 

不过,我觉得一个共享的例子组(见约一半时该页面:http://rspec.info/documentation/)会更漂亮。如果提取,因此它可以在您的所有控制器的规格使用,它会更漂亮..

shared_examples_for "admin actions" do 
    it "should require login" 
end 

然后在每个控制器规格:

describe SomeController do 
    it_should_behave_like "admin actions" 
end 

只需将其添加到您的test_helper.rb中,是这样的:

高清requires_login ... 结束

假设你真的想所有这些说法,你认为shared example groups

shared_examples_for "an action that requires authentication" do 
    it "should render successfuly" do 
    sign_in(user) 
    response.should be_success # or whatever 
    end 

    it "should deny access" do 
    # don't sign_in the user 
    # assert access was denied 
    end 
end 

shared_examples_for "another behaviour" do 
    # ... 
end 

let(:user) { create_user } 

describe "#index" do 
    before(:each) { get :index } 
    it_behaves_like "an action that requires authentication" 
    it_behaves_like "another behaviour" 
end 

describe "#show" do 
    before(:each) { get :show } 
    it_behaves_like "an action that requires authentication" 
end 

# ... 

当然写大量规格的一个基本功能,您应经常检查,如果它是不是已经是一个提供功能(例如检查所呈现的模板库中进行测试,如果前办理通过rails的隐式渲染,可能有点矫枉过正)。