Он выглядит хорошо для меня - вот еще один пример с классом Listing
, который проверяет как ассоциацию и проверку.
class Listing < ActiveRecord::Base
#Associations
belongs_to :user
belongs_to :category, inverse_of: :listings
has_many :photos, dependent: :destroy
has_many :watches
has_many :watchers, -> { uniq }, :through => :watches
has_many :offers, dependent: :destroy
has_many :feedbacks
belongs_to :location, :dependent => :destroy
# Association validations
validates_presence_of :category
validates_presence_of :user
# Attribute validations
validates_presence_of :title, message: "Please add a title."
validates_presence_of :subtitle, message: "Please add a subtitle."
validates_presence_of :price, message: "Please add a price."
validates_presence_of :title, message: "Please select a condition."
require 'rails_helper'
RSpec.describe Listing, type: :model do
#Associations
it { should belong_to(:user) }
it { should belong_to(:category) }
it { should have_many(:photos) }
it { should have_many(:watches) }
it { should have_many(:watchers).through(:watches) }
it { should have_many(:offers) }
it { should belong_to(:location).dependent(:destroy) }
#Association validations
it { should validate_presence_of(:category) }
it { should validate_presence_of(:user) }
#Attribute validations
it { should validate_presence_of(:title).with_message("Please add a title.") }
it { should validate_presence_of(:subtitle).with_message("Please add a subtitle.") }
it { should validate_presence_of(:price).with_message("Please add a price.") }
it { should validate_presence_of(:title).with_message("Please select a condition.") }
Обратите внимание на использование RSpec.describe Class, type: :model
указать тип тестов.
Я бы прочитал reada reada, в котором объясняется больше о доступности совпадений в различных группах примеров. Они обеспечивают четыре категории matchers:
ActiveRecord и ActiveModel matchers доступны только в модели например группы, то есть, те с тегами типа:: модель или в файлы, расположенные под спецификации/модели.
Контроллеры ActionController доступны только в контроллерах групп, то есть те, отмеченные типом:: контроллер или файлы, расположенные под спецификациями/контроллерами.
Маршрутизатор доступен также в группах примеров маршрутизации, то есть тегированные с типом:: маршрутизация или в файлах, расположенных под spec/routing.
Независимые матчи доступны во всех группах примеров.
С точки зрения организации ваши спецификации стремятся отразить ваш каталог приложений (более или менее).
Так что если у вас есть:
app/models/user.rb
app/services/
app/controllers/
app/presenters/
Вы можете отразить это с:
spec/models/user_spec.rb
spec/services/
spec/controllers/
spec/presenters/
Затем вы можете иметь некоторые дополнительные спецификации папки, такие как:
spec/features/ (a folder for integration/feature specs)
Документация RSpec имеет очень хорошую информацию об этом.