Не проверяйте, был ли вызван какой-либо метод или нет.
Это будет привязывать ваши тесты к деталям реализации и заставлять вас менять тесты каждый раз, когда вы будете выполнять рефакторинг (изменение деталей реализации без изменения поведения) вашего класса.проверяется.
Вместо проверки возвращаемого значения или измененного состояния приложения.
Сложно придумать пример, вы не предоставили достаточно контекста о тестируемом классе.
class CreateEntity
def initialize(name)
@name = name
end
def call
if company_name?(@name)
create_company
else
create_person
end
end
def create_person
Person.create!(:name => @name)
end
def create_company
Company.create!(:name => @name)
end
end
# tests
RSpec.describe CreateEntity do
let(:create) { CreateEntity.new(name).call }
describe '#call' do
context 'when person name is given' do
let(:name) { 'Firstname Lastname' }
it 'creates a person' do
expect { create }.to change { Person.count }.by(1)
end
it 'do not create a company' do
expect { create }.not_to change { Company.count }
end
end
context 'when company name is given' do
let(:name) { 'Name & Sons Ltd' }
it 'creates a company' do
expect { create }.to change { Company.count }.by(1)
end
it 'do not create a person' do
expect { create }.not_to change { Person.count }
end
end
end
end
С помощью тестов, приведенных выше, я смогу изменить способ реализации CreateEntity.call
без изменения тестов, если поведение остается прежним.