Rspec-core: рдПрдХ рд╣реА рдпреБрдХреНрддрд┐ рдХреЛ рдХрдИ рдмрд╛рд░ w/рднрд┐рдиреНрди рдлрд╝рд┐рд▓реНрдЯрд░ рдЪрд▓рд╛рдПрдБ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 8 рдЕрдХреНрддреВре░ 2011  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: rspec/rspec-core

_рдЕрд╕реНрд╡реАрдХрд░рдг: рдпрд╣ рдЕрдиреБрд░реЛрдз рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ Capybara рдХреЗ рд╕рд╛рде JavaScript рд╕реНрд╡реАрдХреГрддрд┐ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рд╕реЗ рдЙрдкрдЬрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдЕрдиреНрдп рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВред_

рдореЗрд░реЗ рд╕рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдбрд┐рдд рд╣реИрдВ рддрд╛рдХрд┐ рд╡реЗ рдЬреЗрдПрд╕ рдмрдВрдж рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде рдареАрдХ рдХрд╛рдо рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдЬреЗрдПрд╕ рдХреЗ _on_ рдХреЗ рд╕рд╛рде, рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрднрд╡ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрдЦрдж рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реА рдЕрдЪреНрдЫреА рдШрдВрдЯрд┐рдпрд╛рдБ рдФрд░ рд╕реАрдЯреА рдорд┐рд▓рддреА рд╣реИрдВред рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдЕрдзрд┐рдХрд╛рдВрд╢ рдЪреАрдЬреЛрдВ рдкрд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЗрдВрдЯрд░реИрдХреНрд╢рди рд╕рдорд╛рди рд╣реЛрддреЗ рд╣реИрдВ; рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдбрдмреНрд▓реНрдпреВ/рдФрд░ рдбрдмреНрд▓реНрдпреВ/рдУ рдЬреЗрдПрд╕ рджреЛрдиреЛрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рдЬреЛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд╡рд╣ рдпрд╣ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рд╣реИ рдХрд┐ рдЖрд░рдПрд╕рдкреАрдИрд╕реА рдХреЛ рдПрдХ рд╣реА рд╕реНрдкреЗрдХ рдХреЛ рджреЛ рдмрд╛рд░ рдбрдмреНрд▓реНрдпреВ/рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рд┐рд▓реНрдЯрд░ рд╕реЗрдЯ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдзреНрд╡рдЬ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

it 'does this same thing with and without JS enabled', :run_with => [{:js => true}, {:js => false}] do
    # stuff here
end

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╕рд╛рдЭрд╛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдореА рдХреЛрдб рдмрд╣реБрдд рд╣реА рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред

рдпрджрд┐ рдЖрдк рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ (рд╕реЗрд▓реЗрдирд┐рдпрдо) рдкрд░ рдбрдмреНрд▓реНрдпреВ/рдУ рдЬреЗрдПрд╕ (рд░реИрдХ рдЯреЗрд╕реНрдЯ) рдбрдмреНрд▓реНрдпреВ/рдЬреЗрдПрд╕ рдФрд░ рд╡реЗрдмрдХрд┐рдЯ (рдХреИрдкреАрдмрд╛рд░рд╛-рд╡реЗрдмрдХрд┐рдЯ) рдкрд░ рдбрдмреНрд▓реНрдпреВ/рдЬреЗрдПрд╕ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЗрд╕рдХрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

it 'does this same thing with and without JS enabled', :run_with => [{:js => false}, {:driver => :selenium}, {:driver => :webkit}] do
    # stuff here
end

рдореИрдВ run_with рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рднреА рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХрд╛рдлреА рд╡рд░реНрдмреЛрдЬрд╝ рдирд╣реАрдВ рд╣реИ рдЬреИрд╕реЗ:

it 'does this same thing with and without JS enabled', :run_with_all_drivers => true do
    # stuff here
end

рд╡рд┐рдЪрд╛рд░? рдореИрдВрдиреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдФрд░ рдХреЛрдб рдХреЛ рджреЗрдЦрд╛ рдФрд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рджреЗрдЦрд╛ред

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

рдлрд╝рд┐рд▓реНрдЯрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдЬрд┐рд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП рдкреВрдЫ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд╣рдо рдЖрд░рдПрд╕рдкреАрд╕реА рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░ рд░рд╣реЗ рд╣реИрдВ:

[true, false].each do |js|
  it 'does this same thing with and without JS enabled', :run_with => {:js => js } do
    # stuff here
  end
end

рдпрджрд┐ рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рд╣реИ рдЬрд┐рд╕рдХреА рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯреА рдбреАрдПрд╕рдПрд▓ рд╡рд┐рдзрд┐ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:

module WithAndWithoutJS
  def with_and_without_js(&block)
    [true, false].each do |js|
      context "with :js => #{js}", :run_with => { :js => js } do
        module_eval(&block)
      end
    end
  end

  RSpec.configure { |c| c.extend self }
end

рдлрд┐рд░ рдЖрдк рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

describe "My integration spec" do
  with_and_without_js do
    it "does something with and without js" do
    end
  end
end

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

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдпрджрд┐ рдЖрдк рдПрдХ rspec-multi-filters рд░рддреНрди рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рддреЛ рдмреЗрдЭрд┐рдЭрдХ :)ред

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

рдлрд╝рд┐рд▓реНрдЯрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдЬрд┐рд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП рдкреВрдЫ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд╣рдо рдЖрд░рдПрд╕рдкреАрд╕реА рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░ рд░рд╣реЗ рд╣реИрдВ:

[true, false].each do |js|
  it 'does this same thing with and without JS enabled', :run_with => {:js => js } do
    # stuff here
  end
end

рдпрджрд┐ рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рд╣реИ рдЬрд┐рд╕рдХреА рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯреА рдбреАрдПрд╕рдПрд▓ рд╡рд┐рдзрд┐ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:

module WithAndWithoutJS
  def with_and_without_js(&block)
    [true, false].each do |js|
      context "with :js => #{js}", :run_with => { :js => js } do
        module_eval(&block)
      end
    end
  end

  RSpec.configure { |c| c.extend self }
end

рдлрд┐рд░ рдЖрдк рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

describe "My integration spec" do
  with_and_without_js do
    it "does something with and without js" do
    end
  end
end

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

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдпрджрд┐ рдЖрдк рдПрдХ rspec-multi-filters рд░рддреНрди рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рддреЛ рдмреЗрдЭрд┐рдЭрдХ :)ред

@myronmarston рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдпрд╣ рд╕рд┐рд░реНрдл рдореЗрд░реА рдЕрдЬреНрдЮрд╛рдирддрд╛ рдереА рдХрд┐ рдЖрд░рдПрд╕рдкреАрд╕реА рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╕рдордп рдирд┐рдХрд╛рд▓рдиреЗ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред :)

:+1: рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛

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

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

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

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

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

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

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