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

时间:2011-01-09 13:34:30

标签: ruby-on-rails testing rspec

我有一个 Ruby on Rails 3 admin_controller,其默认设置为CRUD,索引等方法。我想用 rspec 来测试这些中的每个断言。

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

将测试复制粘贴到每个方法的测试组中是很多重复。

,IMO没什么意义
it 'should require login' do

在该测试中多次重复。

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

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

3 个答案:

答案 0 :(得分:2)

鉴于你真的想要所有这些断言,你考虑过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的隐式渲染处理的,可能有点矫枉过正。)

答案 1 :(得分:1)

如果您想沿着迭代测试控制器中每个公共方法的路线,您可以执行以下操作:

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

答案 2 :(得分:0)

只需将其添加到test_helper.rb中,例如:

def requires_login ... 端