Шесто предизвикателство

  1. Опитвам се да напиша следният тест:

    it "raises ArgumentError if not initiated with an array" do
      expect(Polynomial.new("-3, -4, 1, 0, 6").to_s).to raise_error ArgumentError
    end
    

    Методът ми initialize започва с:

    def initialize(coefficients)
      raise ArgumentError unless coefficients.instance_of? Array
    

    Тестът обаче не минава:

    1) Polynomial raises ArgumentError if not initiated with an array
         Failure/Error: expect(Polynomial.new("-3, -4, 1, 0, 6").to_s).to raise_error
         ArgumentError:
           ArgumentError
         # ./challenge6.rb:3:in `initialize'
         # ./sample_spec_c6.rb:17:in `new'
         # ./sample_spec_c6.rb:17:in `block (2 levels) in <top (required)>'
    

    Може ли малко помощ къде ми е грешката?

    P.S. Преработих го и така работи, но все пак, ако имате нешо полезно да кажете по темата ще се радвам:

    it "raises ArgumentError if not initiated with an array" do
      -> { Polynomial.new("-3, -4, 1, 0, 6").to_s }.should raise_error ArgumentError
    end
    
  2. @Александър, Предполагам, че това ти изглежда познато? :-)

    Когато пишеш тест за нещо, което очакваш да хвърли изключение трябва да отложиш изпълняването на нещото, за да дадеш възможност на RSpec да хване изключението.

    expect(Polynomial.new("-3, -4, 1, 0, 6").to_s).to raise_error ArgumentError
    

    В горния код Ruby ще се опита да изпълни Polynomial.new(...).to_s и да подаде резултата като аргумент на expect. RSpec няма да хване нищо, ако се появи изключение.

    expect { Polynomial.new("-3, -4, 1, 0, 6").to_s }.to raise_error ArgumentError
    

    Тук Polynomial.new(...).to_s е затворено в блок (ти си използвал ламбда, което върши същата работа) и няма да се изпълни веднага, expect ще вземе блока и ще изпълни #call метода (който ще доведе до изпълняването на Polynomial.new(...).to_s) очаквайки изключение. Това е.

    EDIT: Ето тук, в RSpec::Matchers::RaiseError#matches? може да се види следният код (от 20-ти ред надолу):

    # КРЪЦ...
    begin
        given_proc.call
    rescue @expected_error => @actual_error
        @raised_expected_error = true
        @with_expected_message = verify_message
    # ...КРЪЦ
    

Трябва да сте влезли в системата, за да може да отговаряте на теми.