[Ruby on Rails] Modelltest mit RSpec

Entwicklungsumgebung

ruby 2.5.7 Rails 5.2.4.3 OS: macOS Catalina

Annahme

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

Vorbereitung des Modelltests

・ Validierungseinstellungen

Dieses Mal werden wir testen, ob es eine Titelspalte und die Anzahl der Zeichen gibt.

app/models/post.rb


class Post < ApplicationRecord
  belongs_to :user
  validates :title, presence: true, length: {maximum: 20}
end

・ Eine Datei erstellen

① Modellordner und Fabrikordner unter Spezifikation erstellen, Erstellen Sie auch eine Datei für das Modell, das Sie testen möchten. Dieses Mal werden wir das Postmodell testen. Um sicherzustellen, dass Benutzer nur Beiträge verfassen können, während sie angemeldet sind, Erstellen Sie auch ein Verwendungsmodell. Die Dateistruktur ist wie folgt.   spec/models/post_spec.rb → Beschreiben Sie, was Sie testen möchten

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

② Ermöglicht die Verwendung von FactoryBot. Es ist praktisch, es zu verwenden, 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

...

Tatsächlicher Code

Erstellen Sie zunächst Dummy-Daten.

spec/factories/user.rb


FactoryBot.define do
  factory :user 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) }
    user
  end
end

Schreiben Sie als nächstes den Testcode.

spec/models/post_spec.rb


require 'rails_helper'

RSpec.describe 'Testen nach dem Modell', type: :model do
  describe 'Validierungstest' do
    #Verwenden Sie die von Fabriken erstellten Dummy-Daten.
    let(:user) { FactoryBot.create(:user) }
    let!(:post) { build(:post, user_id: user.id) }

    # test_Erstellen Sie einen Beitrag und prüfen Sie, ob Sie sich in der Lücke registrieren können.
    subject { test_post.valid? }
    let(:test_post) { post }


    context 'Titelspalte' do
      it 'Darf nicht leer sein' do
        test_post.title = ''
        is_expected.to eq false;
      end
      it 'Muss 20 Zeichen oder weniger enthalten' do
        post.title = Faker::Lorem.characters(number:21)
        expect(post.valid?).to eq false;
      end
    end
  end
  describe 'Assoziationen testen' do
    context 'Beziehung zum Kundenmodell' do
      it 'N:Ist 1' do
        expect(Post.reflect_on_association(:user).macro).to eq :belongs_to
      end
    end

    # has_Es wird auch durch viele Beziehungen beschrieben.
    # context 'Beziehung zum PostComment-Modell' do
      # it '1:Ist N.' do
        # expect(Post.reflect_on_association(:post_comments).macro).to eq :has_many
      # end
    # end
  end
end

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

$ rspec spec/models

Wenn Sie den Test bestehen

Finished in 0.52408 seconds (files took 2.11 seconds to load)
3 examples, 0 failures

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

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, Validierung, um eine Registrierung mit leerem Vorhandensein zu verhindern: true 2, Validierung der Zeichenbegrenzungslänge: {Maximum: 20} 3, Bestätigung der Beziehungsbeziehung gehört: Benutzer

Ich habe das oben Genannte getestet, aber es gibt viele andere Testmethoden Wenn Sie interessiert sind, überprüfen Sie es bitte.

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

[Ruby on Rails] Modelltest mit RSpec
[Ruby on Rails] Test mit RSpec anzeigen
[Ruby on Rails] Controller-Test mit RSpec
[Schienen] Test mit RSpec
Einführung in Rspec mit Ruby on Rails x Docker
Verstehen Sie die Codeabdeckung mit Rspec, dem Ruby on Rails-Testframework
Einführung in Rspec, ein Testframework für Ruby on Rails
Führen Sie Ruby on Rails RSpec-Tests mit GitHub-Aktionen aus
[Schienen] Machen wir einen Unit-Test mit Rspec!
[Ruby on Rails] 1 Modell CRUD (Routing Main)
Modell [Ruby on Rails], Befehl für Controller-Terminal
Hinweise zur Verwendung von FCM mit Ruby on Rails
Ruby on Rails Elementary
Ruby on Rails Grundlagen
Testen Sie Nokogiri mit Rspec.
Ruby On Rails Association
[Ruby on Rails] Bis zur Einführung von RSpec
Veröffentlichen Sie die mit Ruby on Rails erstellte App
[Rails] Verfahren zum Verknüpfen von Datenbanken mit Ruby On Rails
Bestimmen Sie die aktuelle Seite mit Ruby on Rails
[Ruby on Rails] Hochladen mehrerer Bilder mit Refile
Ich habe mit Ruby On Rails ein Portfolio erstellt
[Schienen] Von der Testvorbereitung zum Modelleinheitentest [RSpec]
Portfolioerstellung Ruby on Rails
Ruby on Rails Lernrekord -2020.10.04
[Ruby on Rails] Löschen Sie s3-Bilder mit Active Strage
[Ruby on Rails] Debuck (bindend.pry)
Ruby on Rails Lernrekord -2020.10.05
[Rails / RSpec] Schreiben Sie einen Modelltest (mit Shoulda Matchers / FactoryBot)
Testen Sie Active Strage mit RSpec
Ruby on Rails lernen Rekord-2020.10.07 ②
[Ruby On Rails] Testfehler mit RSpec MySQL-Client ist nicht verbunden
Testen Sie den GraphQL-Resolver mit rspec
Ruby on Rails lernen Rekord-2020.10.07 ①
Brechen Sie die Ruby on Rails-Migration ab
[Rails] Informationen zum Rspec-Antworttest
Ruby on Rails Lernrekord -2020.10.06
Zusammenfassung der Ruby on Rails-Validierung
[Ruby on Rails] Suchfunktion (Modell, Methodenauswahlformel)
Site Map im RSS / Atom-Format mit Ruby on Rails erstellt
Ruby on Rails Grundlegendes Memorandum
Ich habe versucht, das Ruby on Rails-Plugin mit vim-plug zu installieren
[Ruby on Rails] Fügen Sie eine Spalte mit externen Schlüsselbeschränkungen hinzu
[Ruby on Rails] Eliminierung von Fat Controller-First, Logik zum Modell-
[Ruby on Rails] Implementieren Sie die Anmeldefunktion von add_token_to_users mit API
[Ruby On Rails] Bei der Durchführung eines Modell-Unit-Tests mit RSpec mit FactoryBot tritt ein Fehler auf, da der externe Schlüssel nicht eingegeben wurde.
Installieren Sie Ruby mit pacman auf MSYS2
[Ruby on Rails] Leseversuch (: [],: Schlüssel)
Installation von Ruby + Rails unter Ubuntu 18.04 (rbenv)
[Ruby on Rails] Paging-Funktion eingeführt
Grundkenntnisse in Ruby on Rails
Progate Ruby on Rails5 Rückblick