Решение на Четвърта задача - 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 (преди над 8 години)
Това изреждане на променливи не ми харесва особено. Сложи ги долу в 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
няма да се промени версията.