Skip to content

Instantly share code, notes, and snippets.

@maxinspace
Last active August 25, 2016 09:47
Show Gist options
  • Save maxinspace/0e5698fe61afa234f699a577f9df2aab to your computer and use it in GitHub Desktop.
Save maxinspace/0e5698fe61afa234f699a577f9df2aab to your computer and use it in GitHub Desktop.
# плохой пример
RSpec.describe Alarm do
describe "#snooze" do
subject { described_class.new(at: time) }
it { expect { subject.snooze }.to change { subject.at }.by(9.minutes)
end
end
# вариант 1
# subject с именем, it развернут.
# есть однострочные проверки, и многострочные
# имеет ли смысл назначать имя для subject, чтобы тест #snooze был более понятен,
# чтобы мы точно знали, что мы проверяем alarm? Или имя для subject вносит еще больше путаницы?
RSpec.describe Alarm do
let(:time) { Time.zone.now + 1.day }
# subject имеет явное глобальное имя
subject(:alarm) { described_class.new(at: time) }
# проверяем валидацию через однострочник
it { is_expected.to validate_presence_of(:at) }
# развертываем it
describe "#snooze" do
it "pauses alarm for next 9 minutes" do
# subject имеет свое имя
expect { alarm.snooze }.to change { alarm.at }.by(9.minutes)
end
end
end
# вариант 2
# subject не имеет имени, но внутри теста явно определяем alarm как subject, it развернут
# есть однострочные проверки, и многострочные
# есть ли смысл в таком переопределении, чтобы не бегать наверх, и не смотреть что такое subject,
# когда определяется имя для subject прямо внутри describe?
RSpec.describe Alarm do
let(:time) { Time.zone.now + 1.day }
subject { described_class.new(at: time) }
# проверяем валидацию через однострочник
it { is_expected.to validate_presence_of(:at) }
# развертываем it
describe "#snooze" do
# subject виден и описан в describe
let(:alarm) { subject }
it "pauses alarm for next 9 minutes" do
expect { alarm.snooze }.to change { alarm.at }.by(9.minutes)
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment