Решение на Четвърта задача - Unit тестване от Петко Митков
Резултати
- 6 точки от тестове
- 0 бонус точки
- 6 точки общо
- 18 успешни тест(а)
- 1 неуспешни тест(а)
Код
Лог от изпълнението
.............F..... Failures: 1) spec Version::Range tests constructing ranges with versions 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) raise 'error' if start_version.is_a?(Version) || end_version.is_a?(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-1qghg9q/spec.rb:492: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 19.54 seconds 19 examples, 1 failure Failed examples: rspec /tmp/d20161119-19072-1qghg9q/spec.rb:482 # spec Version::Range tests constructing ranges with versions
История (4 версии и 8 коментара)
Петко обнови решението на 17.11.2016 01:24 (преди над 8 години)
Защо?
Сложи тези в тестовете. Така като чета тестовете ме караш постоянно да поглеждам нагоре, за да видя кое с кое сравняваш. Няма смисъл.
Освен това имената first
и second
на едно подсъзнателно ниво ме карат да ти взема точка :)
Имаш два варианта тук:
- Правиш описанията по-добри от
it compares versions
- Махаш
context
-а и слагаш трите примера в единit
, и го кръщавашit 'compares versions with equal length'
В момента ако четеш лога ще видиш "compares versions and returns true" и "compares versions and returns false", които си противоречат.
Тази променлива защо ти е?
Още една безсмислена променлива. Тази дори пречи - по-дълга е от литерала '1.3'
.
Мини през тестовете и ги махни тези.
Опитай да промениш решението, така че този тест да фейлне.
Ами този тест го направих за да проверя дали version.components.object_id != version.components.object_id
, което се очаква, но по много глупав начин. Иначе, ако метода променя вътрешно състоянието и връща копие, то теста ще фейлне, защото не проверява за този случай.
Първият път като го четох съм го разбрал погрешно. Обърка ме dup
-а, който правиш. Затова тестовете трябва да са много очевидни. Сравни твоето решение с това:
version = Version.new('1.2')
version.components.push 10
expect(version.components).to eq [1, 2]