我有一个 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' ....
?
这首先是一个好方法吗?或者我首先采取了错误的路线?
答案 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 ... 端