2016-03-15 5 views
0

Я никогда раньше не писал тест самостоятельно, и я только что закончил свою модельную ассоциацию и перенес ее, поэтому теперь я хотел проверить их. Я добавил в gemfile и установил gem 'shoulda-matchers', '~> 3.0' под group :test и gem 'rspec-rails', '~> 3.0' под group :development, :test. Добавлены конфигурации для сокетов-подсказок в spec/rails_helper.rb. Что дальше? В какой каталог входит тестовый файл? Каковы синтаксические правила написания сокета-указателя, как и для rspec? Как я могу, например, проверить правильность работы этой ассоциации?тестирование с помощью rspec + shoulda-matchers

class Artist < ApplicationRecord 
    has_many events, :through => :lineups 
end 

вот так?

describe Artist do 
    it { should have_many(:events).through(:lineups) } 
end 

ответ

2

Он выглядит хорошо для меня - вот еще один пример с классом 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 имеет очень хорошую информацию об этом.

 Смежные вопросы

  • Нет связанных вопросов^_^