[Ruby on Rails] Controller-Test mit RSpec

Entwicklungsumgebung

ruby 2.5.7 Rails 5.2.4.3 OS: macOS Catalina

Annahme

Wir werden davon ausgehen, dass dies getan wird. [Ruby on Rails] Bis zur Einführung von RSpec

Klicken Sie hier, um das Modell zu testen [Ruby on Rails] Modelltest mit RSpec

Vorbereitung des Controller-Tests

・ Eine Aktion erstellen

Diesmal nur, wenn sich der Benutzer anmeldet Testen Sie, ob es angezeigt wird.

app/controllers/posts_controller.rb


class Admins::PostsController < ApplicationController
  before_action :authenticate_user!
  def index
    @posts = Post.all
  end
end
Supplement [before_action: authenticate_user!] Eine Hilfsmethode für die Entwicklung von Edelsteinen.

・ Eine Datei erstellen

① Erstellen Sie einen Anforderungsordner und einen Fabrikordner unter Spezifikation. Erstellen Sie im Anforderungsordner auch eine Datei für den Controller, den Sie testen möchten Erstellen Sie ein Modell mit Dummy-Daten im Ordner "Fabriken".

Diesmal zum Testen des Postcontrollers Die Dateistruktur ist wie folgt.

spec/requests/posts_request_spec.rb
→ Beschreiben Sie den Inhalt, den Sie testen möchten.

spec/factories/post.rb
spec/factories/admin.rb
→ Dummy-Daten erstellen.

② Ermöglicht die Verwendung von FactoryBot. Die Verwendung ist praktisch, da Sie die Datenbank registrieren und das Modell wie user = create (: user) erstellen können. Erstellen Sie unter spec einen Support-Ordner und eine Datei factory_bot.rb und beschreiben Sie diese wie folgt.

spec/support/factory_bot.rb


RSpec.configure do |config|
  config.include FactoryBot::Syntax::Methods
end

Fügen Sie dann Folgendes hinzu:

spec/rails_helper.rb


# This file is copied to spec/ when you run 'rails generate rspec:install'
require 'spec_helper'
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../config/environment', __dir__)
# Prevent database truncation if the environment is production
abort("The Rails environment is running in production mode!") if Rails.env.production?
require 'rspec/rails'
require 'support/factory_bot' #<-Addition

...

Rails_helper.rb bearbeiten

Die folgenden InhalteRSpec.configure do |config|Hinzufügen.

  • Mit dieser Beschreibung kann die Methode sign_in verwendet werden.

spec/rails_helper.rb


RSpec.configure do |config|

...

  config.include Devise::Test::IntegrationHelpers, type: :request # <--hinzufügen
end

Tatsächlicher Code

Erstellen Sie zunächst Dummy-Daten.

spec/factories/admin.rb


FactoryBot.define do
  factory :admin do
    email { Faker::Internet.email }
    phone_number { 12345678909 }
    password { 'password' }
    password_confirmation { 'password' }
  end
end

spec/factories/post.rb


FactoryBot.define do
  factory :post do
    body { Faker::Lorem.characters(number:20) }
    admin
  end
end

Schreiben Sie als nächstes den Testcode.

spec/requests/posts_request_spec.rb


require 'rails_helper'

RSpec.describe "Post-Controller-Test", type: :request do
  let(:admin) { create(:admin) }
  let(:post) { create(:post) }
  describe 'Eingeloggt' do
    before do
      sign_in admin
    end
    context "Die Postlistenseite wird korrekt angezeigt" do
      before do
        get admins_posts_path
      end
      it 'Anfrage sollte 200 OK sein' do
        expect(response.status).to eq 200
      end
      it 'Der Titel wird korrekt angezeigt' do
        expect(response.body).to include("Beitragsliste")
      end
    end
  end
  describe 'Nicht anmelden' do
    context "Wechselt nicht zur Postlistenseite" do
      before do
        get admins_posts_path(admin)
      end
      it 'Anfrage sollte 401 OK sein' do
        expect(response.status).to eq 401
      end
    end
  end


  # get admins_posts_path(admin)In diesem Fall handelt es sich um einen 401-Fehler, da das Kennwort unterschiedlich ist.
  # get admins_posts_Wenn es sich um einen Pfad handelt, handelt es sich um eine 302-Weiterleitung. Beschreiben Sie ihn daher bitte durch die Person, die Sie testen möchten.

  # describe 'Nicht anmelden' do
  #   context "Wechselt nicht zur Postlistenseite" do
  #     before do
  #       get admins_posts_path
  #     end
  #     it 'Anfrage sollte 302 OK sein' do
  #       expect(response.status).to eq 302
  #     end
  #   end
  # end
end

Führen Sie dann in Ihrem Terminal folgende Schritte aus:

Terminal


$ rspec spec/requests

Wenn Sie den Test bestehen

Finished in 3.64 seconds (files took 2.75 seconds to load)
3 examples, 0 failures

Da es so angezeigt wird, bedeutet dies, dass der Testinhalt korrekt ist.

Referenz (Auszug aus dem Modelltest)

[Ruby on Rails] Modelltest mit RSpec Im Gegenteil, wenn es den Test nicht besteht, können Sie sehen, wo der Fehler auf diese Weise auftritt Sie können feststellen, ob der Testcode falsch ist, die Validierung falsch ist und so weiter.

Failures:

  1)Post-Model-Test Titelspalte des Validierungstests Darf maximal 20 Zeichen enthalten
     Failure/Error: let!(:post) { build(:post) }

     NoMethodError:
       undefined method `build' for #<RSpec::ExampleGroups::Post::Nested::Title:0x000000000619e938>
     # ./spec/models/post_spec.rb:9:in `block (3 levels) in <top (required)>'

  2)Post-Model-Test Titelspalte des Validierungstests Darf nicht leer sein
     Failure/Error: let!(:post) { build(:post) }

     NoMethodError:
       undefined method `build' for #<RSpec::ExampleGroups::Post::Nested::Title:0x0000000007491518>
     # ./spec/models/post_spec.rb:9:in `block (3 levels) in <top (required)>'
Finished in 0.07992 seconds (files took 2.41 seconds to load)
2 examples, 2 failures

Failed examples:

rspec ./spec/models/post_spec.rb:11 #Post-Model-Test Titelspalte des Validierungstests Darf maximal 20 Zeichen enthalten
rspec ./spec/models/post_spec.rb:15 #Post-Model-Test Titelspalte des Validierungstests Darf nicht leer sein

Verwenden Sie außerdem rspec ./spec/models/post_spec.rb:11 unten. Sie können den Testinhalt auch einzeln überprüfen, wie unten gezeigt.

Terminal


$ rspec spec/models/post_spec.rb:11

Zusammenfassung

Diesmal 1, Wird der Bildschirm mit der Beitragsliste korrekt angezeigt, während Sie angemeldet sind? 2, Wird der Titel korrekt angezeigt, während Sie angemeldet sind? 3, Wenn Sie nicht angemeldet sind, können Sie surfen?

Ich habe diese 3 Punkte getestet.

Ordnernamenanforderungen Es wird angefordert zu testen, ob es richtig auf die Anfrage reagiert. Wenn die Anforderung anders ist, wird daher ein Fehler von 401 oder 302 zurückgegeben. Bitte beschreiben Sie entsprechend dem Fehler, den Sie anzeigen möchten.

Auf Twitter werden auch Technologien und Ideen hochgeladen, die nicht auf Qiita hochgeladen wurden Ich wäre Ihnen dankbar, wenn Sie mir folgen könnten. Klicken Sie hier für Details https://twitter.com/japwork

Recommended Posts