Kod testujący. Problem

Panowie to jest mój kod:

class Rectangle
              attr_reader :height, :width
              def initialize(h = 0, w = 0)
                raise ArgumentError.new('Wysokość musi być liczbą dodatnią.') unless
                (h.is_a? Numeric) && (h > 0)
                raise ArgumentError.new('Szerokość musi być liczbą dodatnią.') unless
                (w.is_a? Numeric) && (w > 0)
                @height = h, @width = w
              end
              def perimeter
                (@height + @width) * 2
              end
              def is_square?
                if @height == @width then
                  true
                else
                  false
                end
              end
            end  #Koniec definicji klasy Rectangle.
            #Dołączenie biblioteki testującej:
            require 'minitest/autorun' 
            #Definicja klasy testującej:
            class TestRectangle < MiniTest::Unit::TestCase
              def test_is_square
                assert(true, Rectangle.new(6, 6).is_square?)
                assert(true, !Rectangle.new(3.58, 1234).is_square?)
              end
              def test_perimeter
                assert_equal(48, Rectangle.new(20, 4).perimeter)
                assert_equal(48, Rectangle.new(4, 20).perimeter)
              end
              def test_create_rectangle
                assert_instance_of(Rectangle, Rectangle.new(1,2))
                assert_equal(5, Rectangle.new(5, 8).height)
                assert_equal(8, Rectangle.new(5, 8).width)
                assert_nothing_raised do
                  r = Rectangle.new(3, 4)
                  puts r.height
                  puts r.width
                  puts r.perimeter
                  puts r.is_square?
                end
                assert_raise(ArgumentError) { Rectangle.new(3) }
                assert_raise(ArgumentError) { Rectangle.new(-1, 2) }
                assert_raise(ArgumentError) { Rectangle.new('kot', 6) }
              end
            end

Czy tego typu kod jest kodem zgodnym z Ruby 2.0? Jak już mówiłem uczę się z książki gdzie jest ruby 1.9 ale teoretycznie mi to działa pomijając to ze zamiast
-'require ‘test/unit’ musialem dać 'require ‘minitest/autorun’ (znalazłem to w internecie)

  • w zwykłym assert pojawiło się true:

    assert(true, Rectangle.new(6, 6).is_square?)

i tak naprawde nie wiem po co ono jest. myślałem że można je zmienić na false jeżeli robi się test zwracający false. Próbowałem - nie da się :stuck_out_tongue_winking_eye:

co jeszcze mnie zastanawia to konsola drukuje mi następujący test:

    MiniTest::Unit::TestCase is now Minitest::Test. From testing.rb:35:in `<main>'
Run options: --seed 22115

# Running:

FE.

Finished in 0.001768s, 1696.8700 runs/s, 2262.4933 assertions/s.

  1) Failure:
TestRectangle#test_create_rectangle [testing.rb:49]:
Expected: 5
  **Actual: [5, 8]**


  2) Error:
TestRectangle#test_perimeter:
TypeError: no implicit conversion of Fixnum into Array
    **testing.rb:17:in `+'
    testing.rb:17:in `perimeter'
    testing.rb:43:in `test_perimeter'**

3 runs, 4 assertions, 1 failures, 1 errors, 0 skips

Pogrubione mnie zastanawia i nie umiem odnaleźć błędu w metodzie. W pierwszym dlaczego actuall jest jakąś tablicą a nie zwykłą zmienną? A drugie to w ogóle WTF xD

Mam nadzieje że macie do mnie cierpliwość :stuck_out_tongue: Pozdro i z góry dzięki ;]

Dominik, musisz uważniej uczyć się z książek :wink:

#To jest Twoja nieprawidłowa linia kodu:
@height = h, @width = w
#powinno być tak:
@height= h; @width = w
#albo tak:
@height, @width = h, w
#albo po prostu tak:
@height = h
@width = w

Twój zapis sprawiał, że @height dostawało dwa parametry, a ten jeden ostatni dostawało także width. W Rubym jeśli chcesz, aby interpreter zrozumiał, że robisz nową instrukcję to zwykle robisz kod w nowej linii, ale możliwe jest kończenie jej przy pomocy średnika (prawie jak C, Java etc.). W tym wypadku ten przecinek sprawił, że przypisałeś do zmiennej klasy @width jakąś jedną liczbę, a do zmiennej @height pierwszą liczbę z konstruktora, ale i dodatkowo jedną tę samą co do @width. W języku kompilowaym miałbyś prędzej błąd- ot taki urok tych języków (dodatkowo Ruby jest dynamicznie typowany, dlatego sam nie wyłapałeś tego błędu, który w gruncie rzeczy błędem kodu nie był :wink: )Stąd też błąd z tablicą. W Rubym 1.9.3 wszystko działa bez problemu. W Rubym 2.1.x także, tylko, że musisz pobrać gem test-unit.
Wtedy zamiast obecnego kodu masz taki:

gem 'test-unit'
require 'test/unit'   
#Definicja klasy testującej:
class TestRectangle < Test::Unit::TestCase

Pozdrawiam,
Pat

dzięki ;] Rozumiem wszystko :] i masz racje z średnikiem :stuck_out_tongue: mój błąd.