Я разрабатываю приложение Ruby on Rails, и у меня есть модель BillingPlan
, содержащая следующие методы:
class BillingPlan < ActiveRecord::Base
# ...
def billing_months
dates = [Date.new(Date.today.year, start_month.value, billing_day)]
while dates.size < billings_in_year
dates << dates.last + recurrence.value.months
end
dates.map{ |d| d.month }
end
def billings_in_year
12 / recurrence.value
end
end
Чтобы протестировать код, я написал следующую спецификацию:
describe BillingPlan do
# ...
describe '#billings_in_year' do
subject do
(plan = BillingPlan.new).stubs(
recurrence: stub(value: 4)
) && plan
end
it 'returns the number of billings in a year' do
expect(subject.billings_in_year).to eq(3)
end
end
describe '#billing_months' do
subject do
(plan = BillingPlan.new).stubs(
recurrence: stub(value: 2),
start_month: stub(value: 2),
billings_in_year: 6,
billing_day: 21
) && plan
end
it 'returns the months when billing is done' do
expect(subject.billing_months).to eq([2, 4, 6, 8, 10, 12])
end
end
end
Как видите, мне удалось полностью изолировать два метода с помощью Mocha. Однако мне интересно, не злоупотребляю ли я заглушками в своем тесте? Не слишком ли это зависит от внутренней работы методов? Можете ли вы указать общее правило, чтобы узнать, насколько широко следует полагаться на насмешки/фальсификацию?
Примечание. recurrence
и start_month
являются объектами стороннего класса.