В моей модели у меня есть метод before_validation:
class Post < ActiveRecord::Base
before_validation :generate_url
...
private
def generate_url
return unless self.url.blank?
year = self.published_at.class == ActiveSupport::TimeWithZone ? self.published_at.year : DateTime.now.year
self.url = "#{year}/#{self.title.parameterize}"
end
rspec/модели/post.spec.rb
тестируя w rspec-rails (3.1.0) и factory_girl_rails (4.4.1), я получил spec/models/post_spec.rb для проверки модели Post и spec/factories/post.rb
проверочные тесты терпят неудачу из-за before_validation
Post should require title to be set
Failure/Error: it { is_expected.to validate_presence_of(:title) }
NoMethodError:
undefined method `parameterize' for nil:NilClass
# ./app/models/post.rb:69:in `generate_url'
# ./spec/models/post_spec.rb:20:in `block (2 levels) in <top (required)>'
с оператором отладки в методе generate_url я получаю себя как ноль ... так что кажется, что фабричный пост не принимается во внимание
спец/модели/post_spec.rb
require 'rails_helper'
RSpec.describe Post, :type => :model do
it { is_expected.to validate_presence_of(:title) }
it { is_expected.to ensure_length_of(:title).is_at_least(5) }
it { is_expected.to validate_presence_of(:content) }
it { is_expected.to ensure_length_of(:content).is_at_least(10) }
it { is_expected.to validate_presence_of(:url) }
it { is_expected.to validate_uniqueness_of(:url) }
it { is_expected.to validate_presence_of(:published_at) }
end
спец/фабрики/post.rb
FactoryGirl.define do
factory :post do
user_id 1
title "myTitle"
content "myContent."
published false
published_at "2014-09-16 08:46:38"
end
end
# note : attribute url is generated with before_validation