Решение на Четвърта задача - Unit тестване от Натали Арабаджийска
Към профила на Натали Арабаджийска
Резултати
- 5 точки от тестове
- 0 бонус точки
- 5 точки общо
- 16 успешни тест(а)
- 3 неуспешни тест(а)
Код
Лог от изпълнението
..........F.F...F..
Failures:
1) spec Version tests that #components cannot be used to modify the version
Failure/Error: expect(@solution).to_not pass_tests
expected this solution to not pass the tests:
class Version
VALID_VERSION_REGEXP = /\A\z|\A[0-9]+(\.[0-9]+)*\z/
include Comparable
def initialize(version = '')
unless VALID_VERSION_REGEXP.match(version.to_s)
raise ArgumentError, "Invalid version string '#{version}'"
end
@components = version.to_s
.split('.')
.map(&:to_i)
.reverse
.drop_while(&:zero?)
.reverse
end
def <=>(other)
@components <=> Version.new(other).internal_components
end
def internal_components(positions = 0)
padding_size = positions - @components.size
if padding_size > 0
@components + [0] * padding_size
elsif positions != 0
@components.take(positions)
else
@components.dup
end
end
def components(positions = 0)
padding_size = positions - @components.size
if padding_size > 0
@components + [0] * padding_size
elsif positions != 0
@components.take(positions)
else
@components
end
end
def to_s
@components.join('.')
end
class Range
include Enumerable
def initialize(start_version, end_version)
@start_version = Version.new(start_version)
@end_version = Version.new(end_version)
end
def include?(version)
(@start_version <=> version) < 1 && (@end_version <=> version) == 1
end
def each
current_version = @start_version
while (current_version <=> @end_version) == -1
yield current_version
current_version = increment_version(current_version)
end
end
private
def increment_version(version)
components = version.internal_components(3)
components[2] += 1
components.to_enum.with_index.reverse_each do |_, index|
component = components[index]
if component >= 10 && components[index - 1]
components[index] = 0
components[index - 1] += 1
end
end
Version.new(components.join('.'))
end
end
end
# /tmp/d20161119-19072-sqey10/spec.rb:456:in `block (3 levels) in <top (required)>'
# ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
# ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'
2) spec Version::Range tests constructing ranges with strings
Failure/Error: expect(@solution).to_not pass_tests
expected this solution to not pass the tests:
class Version
VALID_VERSION_REGEXP = /\A\z|\A[0-9]+(\.[0-9]+)*\z/
include Comparable
def initialize(version = '')
unless VALID_VERSION_REGEXP.match(version.to_s)
raise ArgumentError, "Invalid version string '#{version}'"
end
@components = version.to_s
.split('.')
.map(&:to_i)
.reverse
.drop_while(&:zero?)
.reverse
end
def <=>(other)
@components <=> Version.new(other).internal_components
end
def internal_components(positions = 0)
padding_size = positions - @components.size
if padding_size > 0
@components + [0] * padding_size
elsif positions != 0
@components.take(positions)
else
@components.dup
end
end
def components(positions = 0)
padding_size = positions - @components.size
if padding_size > 0
@components + [0] * padding_size
elsif positions != 0
@components.take(positions)
else
@components.dup
end
end
def to_s
@components.join('.')
end
class Range
include Enumerable
def initialize(start_version, end_version)
@start_version = start_version
@end_version = end_version
end
def include?(version)
(@start_version <=> version) < 1 && (@end_version <=> version) == 1
end
def each
current_version = @start_version
while (current_version <=> @end_version) == -1
yield current_version
current_version = increment_version(current_version)
end
end
private
def increment_version(version)
components = version.internal_components(3)
components[2] += 1
components.to_enum.with_index.reverse_each do |_, index|
component = components[index]
if component >= 10 && components[index - 1]
components[index] = 0
components[index - 1] += 1
end
end
Version.new(components.join('.'))
end
end
end
# /tmp/d20161119-19072-sqey10/spec.rb:479:in `block (3 levels) in <top (required)>'
# ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
# ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'
3) spec Version::Range tests include? with versions lower than the start one
Failure/Error: expect(@solution).to_not pass_tests
expected this solution to not pass the tests:
class Version
VALID_VERSION_REGEXP = /\A\z|\A[0-9]+(\.[0-9]+)*\z/
include Comparable
def initialize(version = '')
unless VALID_VERSION_REGEXP.match(version.to_s)
raise ArgumentError, "Invalid version string '#{version}'"
end
@components = version.to_s
.split('.')
.map(&:to_i)
.reverse
.drop_while(&:zero?)
.reverse
end
def <=>(other)
@components <=> Version.new(other).internal_components
end
def internal_components(positions = 0)
padding_size = positions - @components.size
if padding_size > 0
@components + [0] * padding_size
elsif positions != 0
@components.take(positions)
else
@components.dup
end
end
def components(positions = 0)
padding_size = positions - @components.size
if padding_size > 0
@components + [0] * padding_size
elsif positions != 0
@components.take(positions)
else
@components.dup
end
end
def to_s
@components.join('.')
end
class Range
include Enumerable
def initialize(start_version, end_version)
@start_version = Version.new(start_version)
@end_version = Version.new(end_version)
end
def include?(version)
@end_version > version
end
def each
current_version = @start_version
while (current_version <=> @end_version) == -1
yield current_version
current_version = increment_version(current_version)
end
end
private
def increment_version(version)
components = version.internal_components(3)
components[2] += 1
components.to_enum.with_index.reverse_each do |_, index|
component = components[index]
if component >= 10 && components[index - 1]
components[index] = 0
components[index - 1] += 1
end
end
Version.new(components.join('.'))
end
end
end
# /tmp/d20161119-19072-sqey10/spec.rb:522:in `block (3 levels) in <top (required)>'
# ./lib/language/ruby/run_with_timeout.rb:7:in `block (3 levels) in <top (required)>'
# ./lib/language/ruby/run_with_timeout.rb:7:in `block (2 levels) in <top (required)>'
Finished in 18.71 seconds
19 examples, 3 failures
Failed examples:
rspec /tmp/d20161119-19072-sqey10/spec.rb:441 # spec Version tests that #components cannot be used to modify the version
rspec /tmp/d20161119-19072-sqey10/spec.rb:471 # spec Version::Range tests constructing ranges with strings
rspec /tmp/d20161119-19072-sqey10/spec.rb:515 # spec Version::Range tests include? with versions lower than the start one
История (3 версии и 7 коментара)
Натали обнови решението на 16.11.2016 23:44 (преди около 9 години)
Това изреждане на променливи не ми харесва особено. Сложи ги долу в expect-овете. Ще е по-очевидно какви версии тестваш.
Ако решиш да ги оставиш тук ще трябва да им дадеш по-добри имена от versionN, което не е лека задача.
Ползвай .to eq за тези. В твоя случай ако гръмне ще ти даде грешка от рода на expected false to be true, а с .to eq ще ти даде expected <нещо> to eq <друго>
Виж лекцията от понеделник за по-подходящ matcher от .to be true
А тази променлива е напълно излишна.
Тук трябва да направиш още нещо, за да тестваш, че не променя версията. Можеш ли да се сетиш как може да се използва components, за да се промени обекта, ако нямаше dup в кода му?
В този си вид теста е безсмислен - очевидно е, че единствено с извикване на components няма да се промени версията.
Виж пак за по-полезен matcher и махни променливите.
Тук мога да ти върна ['1.2.3', 1,1,1,1,1,1,1,1,1, '1.3.4'] и тестовете ти ще минат всички.

Тук трябва да направиш още нещо, за да тестваш, че не променя версията. Можеш ли да се сетиш как може да се използва
components, за да се промени обекта, ако нямашеdupв кода му?В този си вид теста е безсмислен - очевидно е, че единствено с извикване на
componentsняма да се промени версията.