Rails Testing - RSpec und Minitest für Qualität
Professionelle Rails-Apps haben umfangreiche Tests.
Test-Typen in Rails
Unit Tests (Models)
Test einzelner Model-Methoden:
describe User do
it "validates email presence" do
user = User.new(email: nil)
expect(user).not_to be_valid
end
end
Integration/Request Tests
Test gesamte Request-Response Zyklus:
describe "GET /posts" do
it "returns all posts" do
post = Post.create!(title: "Test", content: "Content")
get "/posts"
expect(response.status).to eq(200)
expect(response.body).to include(post.title)
end
end
System Tests
Test wie Benutzer interagiert (mit Browser):
describe "Creating a post", type: :system do
it "creates a new post" do
visit "/posts/new"
fill_in "Title", with: "My Post"
click_button "Create"
expect(page).to have_text("Post created")
end
end
RSpec Setup
gem 'rspec-rails'
gem 'factory_bot_rails'
rails generate rspec:install
Test-Struktur mit RSpec
describe Post do
describe "validations" do
it { is_expected.to validate_presence_of(:title) }
end
describe "#publish" do
it "changes published status" do
post = create(:post)
post.publish
expect(post).to be_published
end
end
end
Factory Bot für Test Data
FactoryBot.define do
factory :post do
title { "Test Post" }
content { "Test content" }
end
end
Nutzen:
post = create(:post)
posts = create_list(:post, 5)
Mocking und Stubbing
allow(UserMailer).to receive(:deliver_later)
expect_any_instance_of(Post).to receive(:save).and_return(false)
Test Coverage
Gem simplecov zeigt Test Coverage:
# spec/spec_helper.rb
require 'simplecov'
SimpleCov.start
Ziel: 80%+ Code Coverage
Best Practices
- TDD (Test-Driven Development): Test zuerst, Code dann
- Red-Green-Refactor: Fail → Pass → Improve
- DRY: Shared examples für wiederholte Tests
- Beschreibend: "it creates a user" statt "it works"
Häufige Fehler
- ✗ Keine Tests
- ✗ Zu viele Mocks (Tests werden fragile)
- ✗ Tests nur für Glücklichfall
- ✗ Keine Edge Cases
