与rspec&设计,为什么current_user是零?

时间:2016-12-13 08:51:02

标签: ruby-on-rails ruby rspec

describe 'undertake redirect' do
 let(:user) do
  #このuserはbuildのためデータ保存されていない
  build(:user)
 end
 it 'can get undertake show with authenticate undertake user' do
  user1=build(:user)
  login_user user1
  undertake=create(:undertake)
  visit undertake_path(undertake)
  expect(current_path).to eq undertake_path(undertake)
 end
end

这是spec / controllers / undertakes_controller_spec.rb。 这是控制器。

before_action :user_signed_in?              
def show
  @undertake=Undertake.find_by(id: params[:id])
   @comment=current_user.comments.new
end

但是current_user是零。可用的login_user方法是可以的。为什么current_user是零?请帮助我。

2 个答案:

答案 0 :(得分:0)

build(:user)只是使用new方法“构建”用户的实例,但实际上并没有将该用户保存到数据库中。因此无法以该用户身份登录。

请改用create(:user)create将新用户实例保存到数据库中。

附注:build要快得多,因为它不使用数据库,但通常需要使用id从数据库中获取实际记录。

答案 1 :(得分:0)

在您的规范中,您使用build方法来引用您的用户。这不会将用户持久存储在数据库中,因此Devise无法在数据库中找到用户,因此current_user为零。您应该使用create代替。

此外,您应该确保config.include Warden::Test::Helpers中有rails_helper.rb并使用login_as(user)实际登录您的用户。有关Devise的功能规格的更多信息,请参阅here