Тестирование paper_trail с Rails 3

Я пробую пример использования paper_trail v2.6.3 в Rails 3, следуя документации Github для paper_trail. Я хочу написать спецификацию для модели, которая позволит мне проверить, соответствует ли ее версия paper_trail, например:

it { should be_trailed }

и be_trailed должен быть настраиваемым сопоставителем rspec, который должен проверять, является ли модель версионной или нет.

Как написать спецификацию?

P.S. Я не хочу возвращать версии. Я просто хочу проверить, существует ли версия.

Я использую его в demo_app, следуя учебнику по Rails Майкла Хартла:

class User < ActiveRecord::Base
  attr_accessible :email, :name
  has_paper_trail
end 

person shatyajeet    schedule 10.11.2012    source источник


Ответы (2)


Если вы спрашиваете, как писать сопоставители RSpec, документация находится здесь.

Если вы спрашиваете, что должен делать сопоставитель, вы можете попробовать проверить, отвечает ли объект на методы, предоставляемые paper_trail. Например

RSpec::Matchers.define :be_trailed do
  match do |actual|
    actual.respond_to?(:versions)
  end
end
person declan    schedule 10.11.2012
comment
Итак, здесь, где вы упомянули actual.respond_to?(:versions), я могу написать такие методы, как :previous_version, :next_version или любые другие методы в данном документе, верно? - person shatyajeet; 10.11.2012

Общие контексты

Лично мне нравится проверять, что мои модели включают PaperTrail через общие контексты Rspec, например:

./spec/support/shared_contexts/paper_trail_contexts.rb

shared_context 'a PaperTrail model' do
  it { should respond_to(:versions) }

  # You can add other assertions here as well if you like.
end

./spec/models/user_spec.rb

it_behaves_like 'a PaperTrail model'

Выход Rspec

User
  behaves like a PaperTrail model
    should respond to #versions

Я нахожу это более ясным и расширяемым, чем использование пользовательского сопоставления, такого как be_trailed.

person Joshua Pinter    schedule 11.12.2014