【RSpec】컨트롤러의 인스턴스 변수를 테스트로 사용하고 싶을 때 【assigns는 비추천】

4356 단어 RSpec루비Rails
Rails 5부터 assigns (assert_template도)가 더 이상 사용되지 않습니다.
일단 컨트롤러 테스트 자체는 deprecated가 되지 않으므로 assigns는 사용할 수 있지만 rails-controller-testing이라는 gem을 설치해야합니다.

그러나 이것은 어디까지나 기존 프로젝트에 대한 구제책으로, 새로운 프로젝트에서 assigns를 사용하는 것은 추천할 수 없습니다. (부차 이유는 모릅니다. 알고 계신 분이라면 알려주세요 )

@ j 치토 님으로부터 코멘트 받았습니다. 감사합니다!
간단히 말하면, Rails의 태생의 부모가, 「그만하자」라고 하기 때문입니다. (학의 한 목소리??)
자세히 알고 싶은 분은 코멘트란을 봐 주세요

대신,
controller.instance_variable_get("@hoge")

라는 것을 사용하여 인스턴스 변수를 얻을 수 있습니다.

코드 예



최근에 쓴 패스워드 리셋 처리의 테스트를 일부 발췌해 왔습니다.

password_resets_request_spec.rb
RSpec.describe 'PasswordResets', type: :request do
  let(:user) { create(:user) }

 describe 'パスワードリセット編集画面へのアクセス' do
    context '不正なメールアドレスだったとき' do
      it 'userはパスワード再設定ページへリダイレクトされること' do
        post password_resets_path, params: { password_reset: { email: user.email } }
        user = controller.instance_variable_get('@user')
        get edit_password_reset_path(user.reset_token, email: '')
        expect(flash[:danger]).to be_truthy
        follow_redirect!
        expect(request.fullpath).to eq '/password_resets/new'
      end
    end

↑의 코드에서는 reset_token 속성에 액세스하고 싶었기 때문에, 그 때문에 create 액션의 @user 라고 하는 인스턴스 변수를 취득하고 있다고 하는 느낌입니다.

또, 이쪽은 더 좋은 쓰는 방법이 있다(시스템 스펙) 것을, @ j 치토씨로부터 가르쳐 주셨으므로, 후일 이쪽에 추기해 가고 싶습니다!

끝까지 읽어 주셔서 감사합니다!



최근 개인 개발 앱 배포에 필사적이고 조금 짧습니다
배포가 끝나면 다시 기사를 썼다고 생각합니다! ! 잘 부탁드립니다.

좋은 웹페이지 즐겨찾기