我的请求规范中有以下代码:
describe 'Poll' do
subject { page }
context 'as system admin' do
let(:user) { Fabricate(:system_admin) }
before { login user}
it 'is accessible' do
visit '/admin/poll'
current_path.should == '/admin/poll'
end
describe 'sending poll' do
it 'sends to all users' do
save_and_open_page
end
end
end
end
登录用户似乎无法工作,即使该方法似乎工作正常。我试着在it 'is accessible' do
块中使用login user
,如果我这样做的话,这个规范可以很好地工作。如果我把它从那里移除,并像上面一样把它放在before
块中。用户没有保持登录状态。我输入了一个save_and_open_page
进行调试,并在页面中收到了以下通知:
Your account was not activated yet. If a reset password link was sent to you, use that link to change your password.
我使用的是Devise、RSpec、Capybara和Rails3。我还在制作文件中将用户设置为confirm!
。以下是它的外观:
Fabricator(:system_admin) do
first_name { sequence(:first_name) { |n| "Person#{n}"} }
last_name { sequence(:last_name) {|n| "#{n}" } }
email { sequence(:email) { |n| "person_#{n}@example.com"} }
password "foobar"
password_confirmation "foobar"
company_name { sequence(:company_name) { |n| "google#{n}" } }
role "system_admin"
after_create do |user|
user.confirm!
user.create_company
end
end
问题:可能是什么问题?为什么用户没有登录,为什么我收到消息说我应该激活我的帐户?user.confirm!
还不够吗?
这可能是问题所在吗?
制造(:system_admin)!=制造商(:system_admin)
因此,如果您调试save_and_open_page,并且它告诉您帐户未激活,则表明您的捏造工作不正常。你试过调试吗?
你的saveandopenpage是做什么的?它是否试图利用用户做某事?因为我在用let定义时经历过,如果没有触摸变量(在这种情况下是用户),那么它就不存在于该上下文中。此外当你在上面运行这样的规范"是可访问的"时,会有什么错误?只是说没有用户登录?
因此,您可以为登录存根您的方法(例如,如果您有一个名为current_user的方法,它为您提供登录的用户或其他什么),或者不使用let,而是像一样灌输
user=制作(:system_admin)
但是这里有很多好的建议:
http://betterspecs.org/
你的区块上下文和描述似乎太复杂了。我也没有100%遵循这一指导方针,但我认为我应该从中受益,你也会从中受益。
如果你发现它不起作用的另一个原因,请告诉我!
我认为before(:each)
应该解决的问题
添加此Devise方法:
confirmed_at { Time.now }
因此,您的after_create方法应该如下所示:
after_create do |user|
user.confirm!
user.confirmed_at { Time.now }
user.create_company
end