Rspec проверить, что метод имеет значение по умолчанию для аргумента
Возможно, я где-то пропустил это, но как я могу проверить, что метод, который принимает аргумент, использует значение по умолчанию, если аргумент не предоставлен?
пример
# this method shouldn't error out
# if `Post.page_results` without a parameter
class Post
def self.page_results(page=1)
page_size = 10
start = (page - 1) * page_size
finish = start + page_size
return Page.all[start..finish]
end
end
2 ответа
Проверка того, что page
Параметр имеет значение по умолчанию, скорее всего, это не то, что вы должны проверить. В большинстве случаев лучше протестировать поведение, а не реализацию ( поговорите с Sandy Metz о тестировании). В вашем случае вы должны проверить, если ожидаемый набор Pages
возвращается, когда page_results
вызывается без параметров (по умолчанию).
Вот пример того, как вы могли бы сделать это:
describe Post do
describe ".page_results" do
context "when Pages exist" do
subject(:pages) { described_class.page_results(page) }
let(:expected_pages_default) { expected_pages_page_1 }
let(:expected_pages_page_1) { Page.all[0..10] }
let(:expected_pages_page_2) { Page.all[10..20] }
before do
# Create Pages
end
context "when no page param is give " do
# HINT: You need to redefine subject in this case. Setting page to nil would be wrong
subject(:pages) { described_class.page_results }
it { expect(pages).to eq expected_pages_default }
end
context "when the page param is 1" do
let(:page) { 1 }
it { expect(pages).to eq expected_pages_page_1 }
end
context "when the page param is 2" do
let(:page) { 2 }
it { expect(pages).to eq expected_pages_page_2 }
end
end
context "when no Pages exist" do
# ...
end
end
end
Я использую before_validation для установки значений по умолчанию, например
before_validation do
self.some_attribute ||=a_default_value
end
Это оставляет открытой возможность переопределить значение по умолчанию
SomeClassWithDefaultAttributes.create(some_attribute:a_non_default_value)
Имейте в виду, что если #before_validation возвращает false, то проверка завершится неудачно
describe Post do
describe '#page_results' do
let(:post) { create :post }
context 'without arguments' do
it { post.page_results.should eq 1 }
end
end
end
create :post
Скажите, как бы вы сделали это с FactoryGirl. Но вы могли бы, конечно, высмеять или заглушить свою модель.
Обновить
describe Post do
describe '#page_results' do
context 'without arguments' do
it { Post.page_results.should eq 1 }
end
context 'with arguments' do
it { Post.page_results('foo').should eq 'bar' }
end
end
end