Próbuję przetestować, czy ktoś może zalogować się do mojej witryny, wysyłając żądanie POST do mojego SessionsController
. Widziałem tę drogę polecaną w kilku miejscach:Test szyn - sprawdzanie, czy użytkownik jest zalogowany przy pomocy narzędzia Devise
it 'must be able to sign in a user' do
user = create(:user)
post :create, format: :js, user: {email: user.email, password: user.password, remember_me: 0}
assert_response :success
@controller.current_user.must_equal user
end
Ale ten test nie jest poprawny. Wywołanie @controller.current_user
podejmie próbę uwierzytelnienia użytkownika przy użyciu opublikowanych parametrów i zwróci user
, jeśli podany adres e-mail/hasło są poprawne. Nie ma gwarancji, że akcja create
wywołuje w rzeczywistości sign_in
lub current_user
.
Nawet jeśli ponownie napiszę test, aby sprawdzić, czy te metody są wywoływane, możliwe jest, że można wywołać inne metody, np. sign_out
.
Czy istnieje bardziej ostateczny sposób ostatecznego sprawdzenia, czy użytkownik jest zalogowany, a jeśli tak, to kim jest ten użytkownik?
EDIT -
Na przykład, następujący test przejdzie
it 'must sign in a user' do
@controller.current_user.must_equal nil
post :create, format: :js, user: {email: @user.email, password: @user.password, remember_me: 0}
assert_response :success
@controller.current_user.must_equal @user
end
gdy SessionsController # utworzyć działanie jest:
def create
respond_to do |format|
format.js {
render nothing: true, status: 200
}
end
end
Czy to może pomóc? http://stackoverflow.com/questions/23793597/how-to-access-devise-current-user-in-a-rspec-feature-test – tmn4jq
Obawiam się, że nie sądzę, że to pomaga. Nie mam problemu z wywołaniem current_user. – user1063998
to '.current_user' metoda, która próbuje zalogować użytkownika, lub czy jest to attr_reader dla zmiennej instancji? Jeśli pierwszy, wydaje się, że to, co opisujesz, jest oczekiwanym zachowaniem. –