rspec - как проверить атрибут модели, который не является столбцом базы данных
У меня есть модель на основе Active Record:- Дом
У него есть различные атрибуты, но нет formal_name
приписывать. Однако у него есть метод для formal_name
т.е.
def formal_name
"Formal #{self.other_model.name}"
end
Как я могу проверить, что этот метод существует?
Я имею:
describe "check the name " do
@report_set = FactoryGirl.create :report_set
subject { @report_set }
its(:formal_name) { should == "this_should_fail" }
end
Но я получаю undefined method 'formal_name' for nil:NilClass
2 ответа
Решение
Во-первых, вы, вероятно, хотите убедиться, что ваша фабрика хорошо выполняет свою работу, создавая report_set - возможно, поместите factory_girl в группу разработки и тестирования в своем Gemfile, запустите irb, чтобы убедиться, что FactoryGirl.create :report_set
не возвращает ноль.
Тогда попробуй
describe "#formal_name" do
let(:report_set) { FactoryGirl.create :report_set }
it 'responses to formal_name' do
report_set.should respond_to(:formal_name)
end
it 'checks the name' do
report_set.formal_name.should == 'whatever it should be'
end
end
Лично я не фанат используемого вами ярлыка rspec. Я бы сделал это так
describe '#formal_name' do
it 'responds to formal_name' do
report_set = FactoryGirl.create :report_set
report_set.formal_name.should == 'formal_name'
end
end
Я думаю, что так проще понять.
РЕДАКТИРОВАТЬ: Полный рабочий пример с FactoryGirl 2.5 в проекте Rails 3.2. Это проверенный код
# model - make sure migration is run so it's in your database
class Video < ActiveRecord::Base
# virtual attribute - no table in db corresponding to this
def embed_url
'embedded'
end
end
# factory
FactoryGirl.define do
factory :video do
end
end
# rspec
require 'spec_helper'
describe Video do
describe '#embed_url' do
it 'responds' do
v = FactoryGirl.create(:video)
v.embed_url.should == 'embedded'
end
end
end
$ rspec spec/models/video_spec.rb # -> passing test