9
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Rails Tutorialの第4版をRSpecでテスト-5

Last updated at Posted at 2019-01-22

Ruby on Rails チュートリアルの第4版を学習し、Everyday Rails - RSpecによるRailsテスト入門でRSpecを学習したので、Ruby on Rails チュートリアルをRSpecでテストしてみました。
今回は第11章のテストを書きます。

第3章~第10章のテストは以下。

アカウントの有効化

Ruby on Rails チュートリアル 11章のアカウントの有効化をテストしていきます。

送信メールのテスト

アカウント有効化のメールが正しく送信されることをテストします。
Userメイラーを生成すると,spec/mailers/user_mailer_spec.rbが自動で生成されるので、これを利用してアカウント有効化メールの送信とメールプレビューをテストします。

spec/mailers/user_mailer_spec.rb
require "rails_helper"

RSpec.describe UserMailer, type: :mailer do
  let(:user) { FactoryBot.create(:user) }
  
  describe "account_activation" do
    let(:mail) { UserMailer.account_activation(user) }

    # メール送信のテスト
    it "renders the headers" do
      expect(mail.to).to eq ["tester1@example.com"]
      expect(mail.from).to eq ["noreply@example.com"]
      expect(mail.subject).to eq "Account activation"
    end
    
    # メールプレビューのテスト
    it "renders the body" do
      expect(mail.body.encoded).to match user.name
      expect(mail.body.encoded).to match user.activation_token
      expect(mail.body.encoded).to match CGI.escape(user.email)
    end
  end
end

実行しパスするのを確認します。

有効化のテスト

続いて、アカウント有効化が正しく機能することをテストします。
spec/requests/user_spec.rbにcreateアクションのテストを追加しアカウント有効化をテストします。

spec/requests/user_spec.rb
require 'rails_helper'

RSpec.describe "User pages", type: :request do
  let(:user) { FactoryBot.create(:user) }
  let(:other_user) { FactoryBot.create(:user) }
  
  # 他のアクションのテストは省略

  describe "#create" do
    include ActiveJob::TestHelper
    
    it "is invalid with invalid signup information" do
      perform_enqueued_jobs do
        expect {
          post users_path, params: { user: { name: "",
                                            email: "user@invalid",
                                            password: "foo",
                                            password_confirmation: "bar" } }
        }.to_not change(User, :count)
      end
    end
    
    it "is valid with valid signup information" do
      perform_enqueued_jobs do
        expect {
          post users_path, params: { user: { name: "ExampleUser",
                                            email: "user@example.com",
                                            password: "password",
                                            password_confirmation: "password" } }
        }.to change(User, :count).by(1)
        
        expect(response).to redirect_to root_path
        user = assigns(:user)    # gem 'rails-controller-testing'をインストール
        # 有効化していない状態でログインしてみる
        sign_in_as(user)
        expect(session[:user_id]).to be_falsey
        # 有効化トークンが不正な場合
        get edit_account_activation_path("invalid token", email: user.email)
        expect(session[:user_id]).to be_falsey
        # トークンは正しいがメールアドレスが無効な場合
        get edit_account_activation_path(user.activation_token, email: 'wrong')
        expect(session[:user_id]).to be_falsey
        # 有効化トークンが正しい場合
        get edit_account_activation_path(user.activation_token, email: user.email)
        expect(session[:user_id]).to eq user.id
        expect(user.name).to eq "ExampleUser"
        expect(user.email).to eq "user@example.com"
        expect(user.password).to eq "password"
      end
    end
  end
end

ここでは、assignsメソッドを使って対応するアクション内のインスタンス変数にアクセスしています。
assignsメソッドを使用するためにGemfileに'rails-controller-testing'をインストールします。

group :test do
  gem 'rails-controller-testing'
# 他のgemは省略

実行しテストがパスするのを確認します。

今回は以上です。
12章は完成し次第書いていきます。

#追記
第12章のテストを書きました。

9
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?