Rspec-core: рдбрд┐рдмрдЧрд┐рдВрдЧ рд╡рд┐рдлрд▓рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рдВрджрд░реНрдн рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝реАрдЪрд░ рдЕрдиреБрд░реЛрдз

рдХреЛ рдирд┐рд░реНрдорд┐рдд 9 рдЕрдкреНрд░реИрд▓ 2019  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: rspec/rspec-core

рдореБрджреНрджреЗ рдХрд╛ рд╡рд┐рд╖рдп

рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реБрдП, рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рдХреЗрд╡рд▓ рдХреБрдЫ рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реЛрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕реЗрдЯрдЕрдк рдбреЗрдЯрд╛, рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдордп, рдпрд╛ рдЕрдиреНрдп рдЪрд░ рдЬреЛ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдмрдирд╛рддреЗ рд╣реИрдВред рдЙрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЗрдВрдЬреАрдирд┐рдпрд░ рдХреЛ рдЙрд▓рдЯрдирд╛ рдХрдард┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рддрд╣рдд рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдбрд┐рдмрдЧрд┐рдВрдЧ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХ рд╣реЛрдЧрд╛ред рдпрджрд┐ рд╕рдВрджрд░реНрдн рдЪрд░ рдХреЗ рдорд╛рди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓рддрд╛ рд╕рдВрджреЗрд╢ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдПрдХ рдЕрдиреБрдХреВрд▓рд┐рдд рд╡рд┐рдлрд▓рддрд╛ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдПрдХ рдХрд╕реНрдЯрдо рдореИрдЪрд░ рдмрдирд╛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рд╡рд┐рдлрд▓рддрд╛ рд╕рдВрджреЗрд╢ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдирд┐рдлреНрдЯреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЕрдиреБрдХреВрд▓рд┐рдд рд╕рдВрджреЗрд╢ рдХреЗ рд╕рдорд╛рди рдХреБрдЫ, рд▓реЗрдХрд┐рди рдореМрдЬреВрджрд╛ рд╡рд┐рдлрд▓рддрд╛ рд╕рдВрджреЗрд╢ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдпрд╣ рдПрдХ рд╕рдорд╛рди рдкреНрд░рдпрд╛рд╕ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ: https://til.hashrocket.com/posts/a50b3d9313-append-an-rspec-failure-message

рдЖрдкрдХрд╛ рдкрд░реНрдпрд╛рд╡рд░рдг

рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░

1) Colors::awesome_color starts with g
     Failure/Error: expect(subject.awesome_color).to start_with 'g'
       expected "red" to start with "g"
     # ./spec/lib/colors.rb:22:in `block (5 levels) in <top (required)>'

рднрд╡рд┐рд╖реНрдп рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░

1) Colors::awesome_color starts with g
     Failure/Error: expect(subject.awesome_color).to start_with 'g'
       expected "red" to start with "g"
     Context: 
       Variable <strong i="23">@colors</strong> was 'red'. Date was '2019-04-10'
     # ./spec/lib/colors.rb:22:in `block (5 levels) in <top (required)>'

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╣рд╛рдВ, рдЬрд┐рди рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рдЖрдкрдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рд╡реЗ рд╣рдорд╛рд░реЗ рдлреЙрд░реНрдореЗрдЯрд░ рд╣реИрдВ (рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП), рдЖрдкрдХреЛ рдЗрд╕ рдмрд╛рдд рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ "рд╕рдВрджрд░реНрдн" рдХреЛ рдХреИрд╕реЗ рдЯреНрд░реИрдХ рдХрд┐рдпрд╛ рдЬрд╛рдП, #2616 рд╕реЗ рдПрдХ рд╕реБрдЭрд╛рд╡ рд▓реЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЬрд╛рдВрдЪ рдХрд░ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЙрдиреНрд╣реЛрдВрдиреЗ рдпрд╛рдж рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЙрд╕ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ)

рд╕рднреА 5 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

:wave: рдПрдХ рдХрд╕реНрдЯрдо рд╡рд┐рдлрд▓рддрд╛ рд╕рдВрджреЗрд╢ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ:

рдЬреИрд╕реЗ

expect(subject.awesome_color).to(
  start_with('g'),
  "Expected colour to start with 'g' was #{subject.awesome_color}\n" \
  "Context: <strong i="7">@colours</strong> #{@colours}, Date #{@date}"
)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдПрдХ рдкреАрдЖрд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реВрдВрдЧрд╛ рдЬрд╣рд╛рдВ рдЖрдк рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреБрдЫ рдбреЗрдЯрд╛ рдХреНрдпрд╛ рдерд╛, рдЖрдЦрд┐рд░рдХрд╛рд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕рдВрджрд░реНрдн рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ ... рдФрд░ рдлрд┐рд░ рдпрд╣ рд╣рдорд╛рд░реЗ рдлреЙрд░реНрдореЗрдЯрд░реНрд╕ рдХреЛ рд╕рдорд░реНрдерди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реЛрдЧрд╛ред ..

@JonRowe рдХреЛ рд╡рд╛рдкрд╕

рд╣рд╛рдБ, рдореИрдВ рдЕрднреА рдХреЗ рд▓рд┐рдП рдЙрд╕ рд╢реИрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБ! рдореБрдЭреЗ рдХрдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣реЗ рд╣реИрдВ, context / describe рдкрд░ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рдЪреАрдЬреЛрдВ рдХреЛ рд╕реБрдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдореМрдЬреВрджрд╛ рд╡рд┐рдлрд▓рддрд╛ рд╕рдВрджреЗрд╢ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред :-)

рдореИрдВ рдкреАрдЖрд░ рд╕рдмрдорд┐рдЯ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦреВрдВрдЧрд╛ред рдореИрдВ рдЖрд░рдПрд╕рдкреАрдИрд╕реА рдХреЛрдбрдмреЗрд╕ рд╕реЗ рд╕реБрдкрд░ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореБрдЭреЗ рдкреАрдЖрд░ рдЬрдорд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рд╣реИ рддреЛ рдХреНрдпрд╛ рдЖрдк рдпрд╛ рдХреЛрдИ рдФрд░ рдореБрдЭреЗ рд╕рд╣реА рджрд┐рд╢рд╛ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдФрд░ рд╢реИрд▓реА рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛? рдЕрддреАрдд рдореЗрдВ, рдореИрдВ рдХреБрдЫ рдЕрдиреНрдп рдХреЛрдб рдмреЗрд╕ рдореЗрдВ рдЦреЛ рдЧрдпрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрд░рдПрд╕рдкреАрдИрд╕реА рдмрд╣реБрдд рд╕рд╛рдл рдФрд░ рддрд░реНрдХ рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдзрдиреНрдпрд╡рд╛рдж!

рд╣рд╛рдВ, рдЬрд┐рди рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рдЖрдкрдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рд╡реЗ рд╣рдорд╛рд░реЗ рдлреЙрд░реНрдореЗрдЯрд░ рд╣реИрдВ (рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП), рдЖрдкрдХреЛ рдЗрд╕ рдмрд╛рдд рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ "рд╕рдВрджрд░реНрдн" рдХреЛ рдХреИрд╕реЗ рдЯреНрд░реИрдХ рдХрд┐рдпрд╛ рдЬрд╛рдП, #2616 рд╕реЗ рдПрдХ рд╕реБрдЭрд╛рд╡ рд▓реЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЬрд╛рдВрдЪ рдХрд░ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЙрдиреНрд╣реЛрдВрдиреЗ рдпрд╛рдж рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЙрд╕ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ)

рдХреНрдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рдЖрдкрдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ @gaganawhad ?

  after do |example|
    instance_variables.reject { |v| v =~ /@__/ }.each { |v| puts "#{v}: #{instance_variable_get(v)}" }
  end

рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдЕрд░реНрдерд╛рдд:

  after(:dump_ivars) do |example|
    instance_variables.reject { |v| v =~ /@__/ }.each { |v| puts "#{v}: #{instance_variable_get(v)}" }
  end

  describe 'something', :dump_ivars do
  ...
  end

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рд╕рдордЭрдирд╛ рдЕрднреА рддрдХ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдЙрджрд╛рд╣рд░рдг рдЙрд╕ рд╕реНрддрд░ рдкрд░ рдЕрднреА рддрдХ рд╡рд┐рдлрд▓ рд╣реБрдЖ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдЙрдореНрдореАрдж after рд╣реБрдХ рдореЗрдВ рд╕реЗрдЯ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдФрд░ рдЗрд╕реЗ рдмрджрд▓ рд╕рдХрддреА рд╣реИред

рдореБрдЭреЗ рдмрд╕ aggregate_failures , рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд╕рдХреНрд░рд┐рдп рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде рд╣реА рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╡рд┐рдлрд▓рддрд╛ рд╣реЛрдиреЗ рдкрд░ рднреАред

it "parses all entries correctly" do
  result = Parser.call(bar_owner)
  result.each do |entry|
    aggregate_failures("Entry #{entry.id}") do
      expect(entry.name).to match(/\A[A-z][a-z]+\z/)
      expect(entry.owner).to eq(bar_owner)
      expect(entry.tags).to be_present
    end
  end
end

рдпрджрд┐ рдЖрдкрдХреЛ рд╡рд╣рд╛рдВ рджреЛ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдорд┐рд▓рддреА рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдВрджрд░реНрдн рдорд┐рд▓рддрд╛ рд╣реИ ( Entry 76: тАж ), рд▓реЗрдХрд┐рди рдЬрдм рдЖрдк рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╕рдВрджрд░реНрдн рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЖрдк рдПрдХ рдРрд╕реА рддреНрд░реБрдЯрд┐ рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рд┐рдВрдЯ рдЬреЛрдбрд╝реЗ рдмрд┐рдирд╛ рд╕рдордЭрдирд╛ рдмрд╣реБрдд рдХрдард┐рди рд╣реЛрддрд╛ рд╣реИ рд▓реВрдк рдореЗрдВ рдмрдпрд╛рди рдФрд░ рдлрд┐рд░ рд╕реЗ рдЪрд▓ рд░рд╣рд╛ рд╣реИред

рдХреИрд╕реЗ рдПрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ with_failure_context(extra_message) { тАж } рд╡рд┐рдзрд┐ рд╣реИ рдХрд┐ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреЗ рд▓рд┐рдП рдЗрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ aggregate_failures ?

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

marcparadise picture marcparadise  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

phuongnd08 picture phuongnd08  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mlapierre picture mlapierre  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

fabioperrella picture fabioperrella  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

kevinlitchfield picture kevinlitchfield  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ