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是零?请帮助我。
答案 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