我正在开发我的应用程序的管理仪表板部分,以及用户需要登录的每个操作。
所以例如这个测试:
describe 'GET #index' do
let(:user) { create(:user) }
before do
sign_in user
end
it 'responds successfully with an HTTP 200 status code' do
get :index
expect(response).to be_success
expect(response).to have_http_status(200)
end
it 'renders the index template' do
get :index
expect(response).to render_template('index')
end
it 'loads all of the tags into @tags' do
tag1 = create(:tag)
tag2 = create(:tag)
get :index
expect(assigns(:tags)).to match_array([tag1, tag2])
end
end
工作得很好,但我在考虑是否可以将用户创建和sign_in部分提取到可以用于所有这些管理测试的内容。我试过这个:
describe 'GET #index', admin: true do
....all the same as above, except user creation and before sign in block
end
然后在我的spec/spec_helper.rb
中添加了以下内容:
config.before(:each, admin: true) do |_example|
before do
sign_in FactoryGirl.create(:user)
end
end
不幸的是,这不起作用,有没有更好的方法可以做到这一点?完成同样的事情,我可以将登录代码放在一个地方,而不必在我的管理测试中重新过去。
我正在使用Rails 4和Rspec 3。
答案 0 :(得分:1)
你有一个额外的块。删除它所以...
config.before(:each, admin: true) do |_example|
before do
sign_in FactoryGirl.create(:user)
end
end
变成这个......
config.before(:each, admin: true) do
sign_in FactoryGirl.create(:user)
end
另外,如果这些是控制器规格(就像它们看起来那样)那么......
describe 'GET #index' do
实际上应该是这样......
describe SomeController, type: :controller, admin: true do
答案 1 :(得分:0)
共享示例是清理规范和删除代码重复的好方法,请查看https://www.relishapp.com/rspec/rspec-core/docs/example-groups/shared-examples