Шестото предизвикателство вече ви очаква. Примерните тестове както винаги можете да откриете тук, а въпросите си можете да задавате в тази тема.
Шесто предизвикателство
Опитвам се да напиша следният тест:
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
@Александър, Предполагам, че това ти изглежда познато? :-)
Когато пишеш тест за нещо, което очакваш да хвърли изключение трябва да отложиш изпълняването на нещото, за да дадеш възможност на 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 # ...КРЪЦ
Трябва да сте влезли в системата, за да може да отговаряте на теми.